使用计算列索引 JSON 属性
在 SQL Server 中存储 JSON 文档时,我们需要能够有效地过滤和排序 JSON 文档属性的查询结果。
CREATE TABLE JsonTable
(
id int identity primary key,
jsonInfo nvarchar(max),
CONSTRAINT [Content should be formatted as JSON]
CHECK (ISJSON(jsonInfo)>0)
)
INSERT INTO JsonTable
VALUES(N'{"Name":"John","Age":23}'),
(N'{"Name":"Jane","Age":31}'),
(N'{"Name":"Bob","Age":37}'),
(N'{"Name":"Adam","Age":65}')
GO
给定上表如果我们想要找到名称为’Adam’的行,我们将执行以下查询。
SELECT *
FROM JsonTable Where
JSON_VALUE(jsonInfo, '$.Name') = 'Adam'
但是,这将需要 SQL 服务器执行一个完整的表,在大表上不是很有效。
为了加快速度,我们想添加一个索引,但是我们不能直接引用 JSON 文档中的属性。解决方案是在 JSON 路径 $.Name
上添加计算列,然后在计算列上添加索引。
ALTER TABLE JsonTable
ADD vName as JSON_VALUE(jsonInfo, '$.Name')
CREATE INDEX idx_name
ON JsonTable(vName)
现在,当我们执行相同的查询时,SQL Server 使用索引来寻找非聚集索引并找到满足指定条件的行,而不是全表扫描。
注意:要使 SQL 服务器使用索引,必须使用计划在查询中使用的相同表达式创建计算列 - 在此示例中为 JSON_VALUE(jsonInfo, '$.Name')
,但是你也可以使用计算列名称 vName