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