Sql-Server

為什麼在 SQL Server 中使用索引掃描而不是索引搜尋來查詢 JSON 值?

  • January 5, 2021

我有一個具有以下架構的表:

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。

如果您將一個VARCHARNVARCHAR參數/值傳遞到WHERE條件中,它會執行搜尋並刪除讀取的行。

引用自:https://dba.stackexchange.com/questions/282621