有没有办法在 SQL Server 中强制使用一个优化级别?

zli*_*i89 1 sql-server optimization

基于 Paul White 的博客,SQL Server 中存在三个优化阶段,搜索 0(事务处理)、搜索 1(快速计划)和搜索 2(完全优化)。每个阶段都有进入和终止条件。

我的问题是,我们可以强制优化器在一个优化阶段运行吗?

wBo*_*Bob 8

我认为这个问题代表了对优化阶段的误解以及在确实没有必要时尝试覆盖优化器(“我最了解”)的意愿,因为根据我的经验,优化器大部分时间都是正确的. 对于有经验的开发人员来说,在特殊情况下没有更合适的工具可以解决,例如查询重写、不同的索引策略、过滤索引/统计信息、提示、计划指南、计划强制。再次根据我的经验,有时优化器并没有完全正确,它往往是因为过于复杂,无论是在查询还是模式设计中,尽管偶尔会出现错误

阶段搜索 0 - 2 也是完全优化的组成部分,并非所有查询都适用于此。例如,简单查询更有可能被优化为琐碎计划,这比基于成本的完全优化运行成本更低。为什么要强制对只有一条路径的简单查询进行全面优化?此外,如果找到“足够好”的计划,优化可以退出这些阶段。

您可以影响对优化器的某些控制。下面是几个例子:

  • 为优化器提供尽可能多的信息,以便它可以做出正确的决策,例如最新的统计信息、外键、唯一索引、约束、适当的数据类型
  • 为了鼓励简单的计划,您只能编写简单的查询;建立结果集,例如使用临时表
  • 防止并行计划 - 在服务器级别(例如 with sp_configure 'max degree of parallelism')或在查询级别使用OPTION ( MAXDOP 1 ). 例如,在 OLTP 系统中,这不一定是一个坏主意。
  • 有一个跟踪标志来鼓励并行计划,但通常不推荐

因此,希望您能看到强制优化器仅在其中一种模式下运行并没有真正意义。

你有没有觉得优化器做得不好的具体例子?将它们作为问题发布在这里,我相信有人会提供帮助。