请考虑以下代码:
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 ?
答案 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)提示,以便每次都生成一个新的计划,这将是该特定参数集的最佳计划。完整地查看文章。