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

Jam*_*olt 13 sql-server determinism execution-plan

给定以下常量:

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

给定这些常量,SQL Server 是否总是为给定的查询生成相同的计划?

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

Pau*_*ite 14

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

据我所知,查询编译是确定性的。最初的 QO 设计目标之一是应该可以使用数据库的仅统计副本在不同的系统上重现执行计划。围绕配置参数(例如可用内存量和逻辑处理器数量)有一些微妙之处,但这些都包含在要同步的事物列表中。

警告:如果您的列表中的“相同”一词在所有方面都具有完全相同的含义,则情况确实如此。例如,两个系统上可能存在“相同”的统计数据,但只有在直方图步骤和密度信息同时,它们才完全相同

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

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


GETDATE()在查询中使用非确定性函数可能意味着您也会得到不同的计划。虽然主优化器不直接使用该值,但基数估计可以(参见基数估计期间的常量折叠和表达式评估)。不过,我不确定这类差异是否属于问题的范围,因为如果同时执行(或者更一般地说,使用相同的输入变量、参数和函数值),两个系统会产生相同的计划。