Microsoft 关于Trace Flag 4199的知识库文章有点令人困惑:
...任何可能影响查询执行计划的修补程序都必须由跟踪标志控制。除了修复可能导致错误结果或损坏的错误外,这些修补程序默认情况下处于关闭状态,并且需要跟踪标志才能启用修复。
注意:我假设“修补程序”是累积更新(又名“CU”)。如果我错了,请发表评论。
所以...让我们假设我正在运行最新的服务包。SP 包括以前 CU 中的所有修复。是否为 SP(甚至RTM)打开了修补程序?或者仍然需要跟踪标志 4199?
Microsoft 关于Trace Flag 4199的知识库文章有点令人困惑:
...任何可能影响查询执行计划的修补程序都必须由跟踪标志控制。除了修复可能导致错误结果或损坏的错误外,这些修补程序默认情况下处于关闭状态,并且需要跟踪标志才能启用修复。
注意:我假设“修补程序”是累积更新(又名“CU”)。如果我错了,请发表评论。
所以...让我们假设我正在运行最新的服务包。SP 包括以前 CU 中的所有修复。是否为 SP(甚至RTM)打开了修补程序?或者仍然需要跟踪标志 4199?
在此上下文中,您应该将“修补程序”视为表示在 Service Pack、累积更新或按需修补程序中结束并属于此跟踪标志管辖范围内的任何修补程序。这些修复都在每个主要受支持版本的最新版本中,但除非打开跟踪标志,否则不会使用它们。这是因为,在某些情况下,“修复”实际上会导致回归(和更差的性能)——人们不应该仅仅因为他们应用了更新或服务包就期望计划生成有重大变化。
我不确定这是否是一个详尽的列表,但这篇文章列出了许多最终归入 4199 保护伞的 41xx TF。这篇博文中提供的 v4 PDF可能包含更多标志(我没有交叉检查)但肯定包含有关几个单独修复的更多信息。
在未来的某个时候,我怀疑 TF4199 的所有增强功能都将在新的完整主要版本中默认启用(但不在服务包或 CU 中)。也许他们会提供一个跟踪标志来关闭它们,就像您可以关闭新的基数估计器一样。
我在 Microsoft 的 SQL Server Tiger 团队工作,该团队负责生成上述大部分修补程序。修补程序是在 RTM(发布到制造)之后更改软件的任何内容,包括 CU、Service Pack(包括在 Service Pack 发布前几周发布的所有 CU)、GDR(关键安全修复)和 OD(On需求修补程序)。
任何最终在 4199 保护伞下的修复都应该在未来版本的 SQL Server 中默认启用,在未来的兼容性级别下,因为它们预计在绝大多数情况下都会有所改进。但是,就像拥有数百万用户的任何事物一样,计划更改可能会使大多数人受益,但由于某种原因会伤害少数用户。因此,我们要求用户明确启用任何可以使用跟踪标志 4199 更改计划的代码更改,除非该更改会影响结果的正确性、安全性或损坏。
需要注意的一件事(上面 Aaron 的回答中遗漏了这一点)是,对于每个新版本,我们都有一个新的兼容性级别,从某种意义上说,它会重置 4199 标志。在为 RTM 捕捉 SQL Server 2016 时发布的任何修复程序默认情况下都应存在于 2016 年的兼容级别 130 中。如果未启用 4199,您可以通过更改数据库的兼容级别返回到 2014 年的行为,无论好坏到 120。但是,一旦在服务器上启用了 4199,无论兼容级别如何,您都可以获得所有修复。RTM 发布后的任何修复将再次受到 4199 的保护。
TL;DR:在 RTM 之后,如果不启用跟踪标志 4199,则不会启用任何计划更改修复程序,无论服务包或 CU 级别如何。在下一个 RTM 版本中,任何现有的 4199 修复将默认启用,并且该过程重新开始。