一种方法是做这样的事情:
declare @myParameter int
select *
from dbo.foo t
where t.someColumn = coalesce(@myParameter , t.someColumn)
优化仍然可以在t.someColumn
使用索引和你避免OR
操作(这是什么通常bolluxes了使用索引的
这是一件事看
另一件事:我不得不做同样的事情在以前的工作中proble。米,编码它天真的是,你可能得到性能差的多种原因中的任何一个:如果执行的第一个查询与你可能会形容为“非标”执行
我伤口什么事做,是仪器的存储过程,记录它是如何被调用。一旦我有了一些基准数据,一点分析就会告诉我它使用的4种或5种最常用的方法。
这使我可以为这些最常见的方法添加场景,所以90%的调用者获得了很好的性能,其余大部分都获得了良好的性能,并且曾经有过特殊情况我们无法做任何事情(除非数据库管理员愿意重新选择参与选择的一些表......这看起来不太可能)。
另外,您应该将存储过程参数分配给存储过程中的局部变量。如果不这样做,传递的参数会影响执行计划的缓存方式。通过这样做,参数的值就成为一个表达式,不再影响执行计划的cachin。
此外,请注意存储过程的重新编译。在繁忙的系统中,重新编译可能会对性能产生不利影响。如果存储过程在每次存储过程调用时重新编译一次或多次,则重新编译会取出编译锁(A)阻止其他人执行存储过程,直到重新编译完成,并且(B)锁定涉及的各种资源/依赖项在重新编译。在一个繁忙的系统中,你的DBA不太可能对阻塞感兴趣。
这里有Execution Plan Caching and Reuse
希望这有助于MSDN。
看一看http://www.sommarskog.se/dyn-search.html –
是什么让你说动态SQL的速度非常慢?另外,在我根据他们做出设计决策之前,我会验证任何谣言。 –
@Alex K:你会相信几秒钟之前有人刚刚注意到我完全一样的网址吗?谢谢:) – JSWork