在SQL Server中,允许SP中的一个查询存在多个执行计划而不必每次都重新编译的最佳方式是什么?
例如,我有一个例子,根据查询使用的临时表中有多少行,查询计划会有很大的不同。由于没有令人满意的“一刀切”计划,而且每次都重新编译是不可接受的,因此我最终在几个IF语句中多次复制/粘贴(ick) SP中的主查询,迫使SQL引擎为每个case提供自己的最佳计划。它实际上在性能方面看起来工作得很好,但感觉有点笨拙。(我知道我同样可以将这一部分分成多个SP来做同样的事情。)有没有更好的方法来做这件事?
IF @RowCount < 1
[paste query here]
ELSE IF @RowCount < 50
[paste query here]
ELSE IF @RowCount < 200
[paste query here]
ELSE
[paste query here]
发布于 2011-05-12 13:32:09
您可以在某些情况下使用OPTIMIZE FOR来创建针对某个参数值的计划(但不是多个计划本身)。这使您可以指定在创建执行计划时希望SQL Server使用的参数值。这是SQL Server 2005更高版本的提示。
Optimize Parameter Driven Queries with the OPTIMIZE FOR Hint in SQL Server
还有OPTIMIZE FOR UNKNOWN - SQL Server2008之后的特性(谨慎使用):
此提示指示查询优化器在根本没有将参数值传递给查询的情况下使用它一直使用的标准算法。在这种情况下,优化器将查看所有可用的统计数据,以确定用于生成查询计划的局部变量的值应该是多少,而不是查看应用程序传递给查询的特定参数值。
也许还可以研究一下optimize for ad hoc workloads Option
发布于 2012-01-30 21:50:44
SQL Server 2005+具有语句级重新编译功能,并且能够更好地处理这种分支。您仍然有一个计划,但是该计划可以在语句级别进行部分重新编译。
但它是丑陋的。
我个人倾向于使用@Mitch using的选择,因为您无论如何都需要使用临时表对存储过程进行重新编译。请参阅Temp table and stored proc compilation
https://stackoverflow.com/questions/5973634
复制相似问题