2010-11-23 81 views
0

考虑下面的代码:条件凡在SQL语句使用索引扫描而不是索引查找

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但第二个回退到一个INDEX SCAN由于@TaskId变量的条件检查。有没有什么办法可以进行条件检查(例如,如果@TaskId是一个过滤器,并且-1应该返回所有行)并且仍然使查询使用一个INDEX SEEK

回答

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)提示,以便它每次生成一个新计划,这将是该特定参数集的最佳计划。尽管看看这篇文章。

+0

谢谢,是的,它的作品。但是如果我有例如10个变量都需要进行条件检查(例如,将过滤器作为存储过程的报告),那么代码就会失去控制。 – brunnsbe 2010-11-23 12:02:59

相关问题