SQL中的条件WHERE语句使用索引扫描而不是索引查找

时间:2010-11-23 11:03:34

标签: sql sql-server indexing conditional

请考虑以下代码:

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);

我在表格上有一个非聚集索引,其中索引为 TaskId 列。 第一个 SELECT 使用带有 INDEX SEEK 的索引,但由于@TaskId的条件检查,第二个回退到 INDEX SCAN 变量。有没有办法进行条件检查(如果 @TaskId 是一个过滤器而 -1 应该返回所有行)仍然得到查询使用 INDEX SEEK

1 个答案:

答案 0 :(得分:3)

尝试:

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

当@TaskId = -1时,它当然不会进行索引搜索,因为它只是读取所有数据。

<强>更新
在此查看this excellent article - 动态搜索是一种常见情况 您应该注意的是执行计划缓存,因为当您从一组“可选”参数切换到另一组时,您可能会遇到性能不佳 - 因此您最终可能会使用较差的执行计划,从而导致性能下降。在这种情况下,您可能需要考虑使用OPTION(RECOMPILE)提示,以便每次都生成一个新的计划,这将是该特定参数集的最佳计划。完整地查看文章。