簡體   English   中英

SQL中的條件WHERE語句使用索引掃描而不是索引查找

[英]Conditional WHERE statement in SQL uses Index Scan instead of Index Seek

考慮以下代碼:

DECLARE @TaskId int;
SET @TaskId = 594725;

SELECT Report.Amount FROM Report WHERE Report.TaskId = @TaskId;

SELECT Report.Amount FROM Report WHERE (@TaskId = -1 OR Report.TaskId = @TaskId);

我在表Report上有一個非聚集索引,其中TaskId列已建立索引。 第一個SELECT使用帶有INDEX SEEK的索引,但是第二個SELECT由於對@TaskId變量的條件檢查而回退到INDEX SCAN 有什么方法可以進行條件檢查(例如,如果@TaskId是過濾器,並且-1應該返回所有行),並且仍然使查詢使用INDEX SEEK

嘗試:

IF (@TaskId = -1)
    SELECT Report.Amount FROM Report
ELSE
    SELECT Report.Amount FROM Report WHERE Report.TaskId = @TaskId

當@TaskId = -1時,它當然不會執行索引查找,因為它將僅讀取所有數據。

更新:
請查看這篇出色的文章 -動態搜索是一種常見的情況。
您應該意識到的是執行計划緩存,因為當您從一組“可選”參數切換到另一組“可選”參數時,您可能會遇到性能下降的情況-因此,您最終可能會使用較差的執行計划,從而導致性能下降。 在這種情況下,您可能要考慮使用OPTION(RECOMPILE)提示,以便它每次都會生成一個新鮮的計划,這將是針對該特定參數集的最佳計划。 不過,請查看全文。

暫無
暫無

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

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