使用计算列索引 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