簡體   English   中英

索引掃描而不是搜索

[英]Index scan instead of a Seek

我在表上添加了一個新的計算列:

ALTER TABLE MyTable
ADD DATAORA_STOCK AS (Data_stock + Ora_Stock)

其中Data_Stock類型為char(8)Ora_Stock類型為char(6)

在此DATAORA_STOCK列中創建新的非聚集索引之后:

CREATE NONCLUSTERED INDEX [IX_MyTable_DATAORA_STOCK] ON MyTable
(
    [DATAORA_STOCK] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

當我執行這兩個查詢時:

SELECT * FROM MyTable
WHERE DATAORA_STOCK = @Data1

和:

SELECT * FROM MyTable
WHERE DATAORA_STOCK >= @Data1

我有兩個不同的執行計划。 在IX_MyTable_DATAORA_STOCK上進行第一個查詢查找,然后進行鍵查找。

為什么第二次對聚集索引執行掃描索引?

使用OPTION(RECOMPILE)可以很好地工作,並且實際的(未估計的)執行計划是正確的。 不幸的是,我無法修改查詢文本,因為它是從應用程序中調用的……我已經更新了表格的統計信息,但沒有任何變化。 確切的查詢文本為:

SELECT * 
FROM MyView
WHERE DatAgg+OraAgg >= @Data1 AND DatAgg+OraAgg <= @Data2 

其中DatAgg+OraAgg是原始表中的DATAORA_STOCK (視圖僅是MyTable的投影),而DATAORA_STOCK是計算列。

因為索引沒有覆蓋,並且估計索引返回的行數

  WHERE DATAORA_STOCK >= @Data1

將導致太多的查詢來檢索丟失的列值,以至於掃描整個對象就便宜了。

如果估計錯誤,則可以嘗試使用OPTION (RECOMPILE)使其嗅探@Data1的值(如果估計仍然錯誤,請更新該列上的統計信息)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM