James Lupolt Asked: 2014-05-11 04:09:39 +0800 CST2014-05-11 04:09:39 +0800 CST 2014-05-11 04:09:39 +0800 CST SQL Server 中执行计划创建的确定性如何? 772 给定以下常量: 具有相同结构(表、索引等)的相同数据库 相同的数据 相同的 SQL Server 和硬件配置 同样的统计 客户端中相同的 SET 选项 相同的 SQL Server 版本 相同的跟踪标志 给定这些常量,SQL Server 是否会始终为给定查询生成相同的计划? 如果没有,是否有其他考虑?是否还要考虑不确定性因素? sql-server execution-plan 1 个回答 Voted Best Answer Paul White 2014-05-11T10:57:37+08:002014-05-11T10:57:37+08:00 给定这些常量,SQL Server 是否会始终为给定查询生成相同的计划?如果没有,是否有其他考虑?是否还要考虑不确定性因素? 据我所知,查询编译是确定性的。最初的 QO 设计目标之一是应该可以使用数据库的仅统计副本在不同的系统上重现执行计划。围绕可用内存量和逻辑处理器数量等配置参数,这有一些微妙之处,但这些都包含在要同步的事物列表中。 警告:如果你的列表中的“相同”一词被认为在所有方面都完全相同,那是正确的。例如,两个系统上可能存在“相同”的统计数据,但只有在直方图步长和密度信息相同的情况下,它们才完全相同。 也就是说,优化过程也极其复杂,这意味着很难确保此确定性过程的所有输入都相同,并且所有内部状态都足够相似以确保针对特定的优化器采用相同的代码路径。汇编。如果查询包含数据库外部(对另一个数据库或实例)的访问,则这些环境也必须相同。 我要添加到您的列表中的一件事是检查第二个数据库中是否也存在任何计划指南。 在查询中使用非确定性函数GETDATE()可能意味着您也会得到不同的计划。虽然主优化器不直接使用该值,但基数估计可以(请参阅基数估计期间的常量折叠和表达式求值)。我不确定这类差异是否属于问题的范围,因为如果同时执行(或者更一般地说,使用相同的输入变量、参数和函数值),两个系统会产生相同的计划。
据我所知,查询编译是确定性的。最初的 QO 设计目标之一是应该可以使用数据库的仅统计副本在不同的系统上重现执行计划。围绕可用内存量和逻辑处理器数量等配置参数,这有一些微妙之处,但这些都包含在要同步的事物列表中。
警告:如果你的列表中的“相同”一词被认为在所有方面都完全相同,那是正确的。例如,两个系统上可能存在“相同”的统计数据,但只有在直方图步长和密度信息相同的情况下,它们才完全相同。
也就是说,优化过程也极其复杂,这意味着很难确保此确定性过程的所有输入都相同,并且所有内部状态都足够相似以确保针对特定的优化器采用相同的代码路径。汇编。如果查询包含数据库外部(对另一个数据库或实例)的访问,则这些环境也必须相同。
我要添加到您的列表中的一件事是检查第二个数据库中是否也存在任何计划指南。
在查询中使用非确定性函数
GETDATE()
可能意味着您也会得到不同的计划。虽然主优化器不直接使用该值,但基数估计可以(请参阅基数估计期间的常量折叠和表达式求值)。我不确定这类差异是否属于问题的范围,因为如果同时执行(或者更一般地说,使用相同的输入变量、参数和函数值),两个系统会产生相同的计划。