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