[英]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.