SQL Server中执行计划创建的确定性如何?


13

给定以下常量:

  • 具有相同结构(表,索引等)的相同数据库
  • 相同的数据
  • 相同的SQL Server和硬件配置
  • 相同的统计
  • 客户端中相同的SET选项
  • 相同的SQL Server版本
  • 相同的跟踪标志

给定这些常量,SQL Server会始终为给定查询生成相同的计划吗?

如果没有,还有其他考虑吗?是否还需要考虑不确定性因素?


说相同的计划是不正确的,但是我们可以说类似的计划。以及DBA /开发人员可以控制的外部因素;SQL Server引擎内部编写了“查询计划优化算法”和“内部查询成本算法”。我们没有以所有方式告诉“选择什么”的控制权。我们可以设置外部环境来引导引擎选择最佳。对于给定的查询,如果优化程序提出了两个执行计划,可以说有0.001的成本差异,那么我猜这与选择的执行计划无关。
Anup Shah 2014年

我不认为您应该对此理论。我在不同的数据库上工作了25年,并且几乎总是可以重写查询以更好地执行。有时很难理解为什么用一种编写查询的方式会更好。

Answers:


13

给定这些常量,SQL Server会始终为给定查询生成相同的计划吗?如果没有,还有其他考虑吗?是否还需要考虑不确定性因素?

据我所知,查询编译是确定性的。最初的QO设计目标之一是,应该可以使用仅统计信息的数据库副本在不同的系统上重现执行计划。关于配置参数,例如可用的内存量和逻辑处理器的数量,有一些细微的差别,但是这些在您要同步的事物列表中已涵盖。

警告:只要您的清单中的“相同”一词在各个方面都表示完全相同,那就是正确的。例如,两个系统上可能存在“相同”的统计信息,但只有直方图步长和密度信息同时,它们才完全相同

也就是说,优化过程也非常复杂,这意味着很难确保此确定性过程的所有输入都相同,并且所有内部状态都足够相似,以确保针对特定对象的优化器采用相同的代码路径汇编。如果查询包含数据库外部(对另一个数据库或实例)的访问,则这些环境也必须相同。

我要添加到列表中的一件事是检查第二个数据库中是否还存在任何计划指南


GETDATE()在查询中使用非确定性函数可能意味着您也获得了不同的计划。尽管主优化器不直接使用该值,但是基数估计可以使用(请参见基数估计期间的恒定折叠和表达式求值)。我不确定这种差异是否落在问题的范围之内,因为如果两个系统同时执行(或更广泛地说,使用相同的输入变量,参数和函数值),则两个系统都会产生相同的计划。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.