Sql-Server
為什麼在 SQL Server 中使用索引掃描而不是索引搜尋來查詢 JSON 值?
我有一個具有以下架構的表:
CREATE TABLE [dbo].[Obj1Json]( [ObjectID] [int] IDENTITY(1,1) NOT NULL, [PointerToSource] [nvarchar](255) NULL, [CreateDate] [datetime2](7) NOT NULL, [ModifiedDate] [datetime2](7) NOT NULL, [Indexes] [nvarchar](max) NULL, [vAccountID] AS (json_value([Indexes],'$.AccountID'))
其中
Indexes
列包含如下所示的 JSON:{ "AccountID": 73786, "AccountName": "5869b4e9-f441-463f-8f6d-93b4f4ff8c75", "ProcessLocation": "Start", "IsPasswordProtected": true, "InvoiceDate": "2020-12-30T09:00:32.8473077-05:00" }
該
vAccountID
列用於 JSON 中的索引Indexes
:CREATE INDEX IDX_Obj1Json_AccountID ON Obj1Json(vAccountID)
該表有大約 1050 萬行隨機生成的數據(但 Indexes 列中的所有數據都具有相同的結構)。我正在執行的查詢是
SELECT JSON_VALUE(Indexes, '$.AccountID') FROM [Obj1Json] WHERE JSON_VALUE(Indexes, '$.AccountID') = 69725
返回 110 個結果。在 SSMS 中查看執行計劃時,我看到正在使用索引掃描,而我希望使用索引搜尋。
查詢很快返回(不到一秒),但我很好奇為什麼不使用索引搜尋。SQL Server 使用索引掃描而不是查找是否有任何明顯的原因?
問題是 JSON_VALUE 返回一個
NVARCHAR
並且您發送了一個INTEGER
. 這會導致 Convert_Implicit。如果您將一個
VARCHAR
或NVARCHAR
參數/值傳遞到WHERE
條件中,它會執行搜尋並刪除讀取的行。