首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL Server中,如何为SP中的单个查询提供多个执行计划,而不必每次都重新编译?

在SQL Server中,如何为SP中的单个查询提供多个执行计划,而不必每次都重新编译?
EN

Stack Overflow用户
提问于 2011-05-12 13:26:44
回答 2查看 1.4K关注 0票数 1

在SQL Server中,允许SP中的一个查询存在多个执行计划而不必每次都重新编译的最佳方式是什么?

例如,我有一个例子,根据查询使用的临时表中有多少行,查询计划会有很大的不同。由于没有令人满意的“一刀切”计划,而且每次都重新编译是不可接受的,因此我最终在几个IF语句中多次复制/粘贴(ick) SP中的主查询,迫使SQL引擎为每个case提供自己的最佳计划。它实际上在性能方面看起来工作得很好,但感觉有点笨拙。(我知道我同样可以将这一部分分成多个SP来做同样的事情。)有没有更好的方法来做这件事?

代码语言:javascript
运行
复制
IF @RowCount < 1
    [paste query here]
ELSE IF @RowCount < 50
    [paste query here]
ELSE IF @RowCount < 200
    [paste query here]
ELSE
    [paste query here]
EN

回答 2

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2012-01-30 21:50:44

SQL Server 2005+具有语句级重新编译功能,并且能够更好地处理这种分支。您仍然有一个计划,但是该计划可以在语句级别进行部分重新编译。

但它是丑陋的。

我个人倾向于使用@Mitch using的选择,因为您无论如何都需要使用临时表对存储过程进行重新编译。请参阅Temp table and stored proc compilation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5973634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档