【问题标题】:Compatibility level upgrade from 100 to 130, "Query Optimizer Fixes" flag兼容性级别从 100 升级到 130,“查询优化器修复”标志
【发布时间】:2017-03-06 16:10:48
【问题描述】:

我刚刚将数据库从旧的 2008 sql 服务器迁移到新的 2016 服务器。我让它在兼容性 100 级运行了一段时间,一切都很好。我已经运行了升级顾问,没有任何标记也在测试环境中测试了系统,设置了 130 级..一切都很好。

我已经在生产中进行了切换,CPU 负载略高于正常水平,不确定一旦创建了带有新 CE 的新计划,这是否会随着时间的推移自行纠正。还发现了一个选项“查询优化器”修复“启用此标志的确切作用是什么?

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:

    简单来说,微软过去常常以跟踪标志的形式发布修补程序来查询优化器,每个修补程序都有自己的跟踪标志..

    比如说,如果你有以下问题

    在 SQL Server 2005 中使用游标执行更新操作时出现错误消息:“事务(进程 ID)在锁定资源上与另一个进程发生死锁,并已被选为死锁牺牲品”

    微软为此发布了一个 HotFix,在一些跟踪标志 4120..下。

    因此,要应用此修复程序,您必须启用如下所示的跟踪标志

    DBCC TRACEON (4120,-1)

    想象一下,为所有修补程序启用跟踪标志,这将是多方面的。所以微软,从 SQL2005 开始,提出了一个单一的跟踪标志 4199,它涵盖了所有与优化器相关的修补程序

    如果客户看到任何与优化器相关的问题,他们可以启用这个单一的跟踪标志。这种做法也屏蔽了其他客户,因为只有看到问题的客户才会应用这个跟踪标志。

    在 SQL2016 中,SQLServer 删除了这个跟踪标志,并提出了这个数据库范围配置。

    启用此选项将帮助您获得最新的查询优化器修复,最好的部分是这可以在数据库级别启用,而不是跟踪标志,它始终在服务器级别起作用..

    Microsoft 建议在下面启用此跟踪标志:

    仅建议遇到特定性能问题的客户使用跟踪标志 4199,建议客户在将其数据库迁移到最新兼容级别后删除跟踪标志 4199,因为跟踪标志 4199 将被重复用于未来可能不适用的修复到您的应用程序,并可能导致生产系统上的计划性能发生意外变化

    在这种情况下,Traceflag 4199 等同于查询优化器修复选项

    参考资料: https://support.microsoft.com/en-us/help/974006/sql-server-query-optimizer-hotfix-trace-flag-4199-servicing-model

    【讨论】:

    • 那么你会建议打开它吗?获得所有优化修复需要多长时间?一个 sprocs 运行时间从不到 1 秒到 1:48 秒。我暂时启用了旧的跟踪标志
    • ,Microsoft 会针对任何问题发布修补程序,如果您的问题与修补程序中描述的问题有关,则可以打开它。大多数情况下,这些修补程序也会包含在服务包和累积更新中
    【解决方案2】:

    TL:DR 如果您使用的是 SQL Server 2016,并且您的兼容性级别设置为 SQL Server 2016 (130),则可以放心地忽略它。您可以将其设置为打开或关闭,这没关系。 安全的选择是关闭它


    我也一直在寻找这个问题的答案。有几篇帖子的 the answer by TheGameiswar 的较短版本没有详细说明。

    微软关于它的说法相当简短。

    在数据库级别启用或禁用“QUERY_OPTIMIZER_HOTFIXES”,以利用最新的查询优化器修补程序,无论数据库的兼容性级别如何。这相当于跟踪标志 4199 Source

    我找到的最清楚的答案是 Dave Pinal 在他的帖子SQL SERVER – Database Scoped Configurations – Query Optimizer Fixes

    在 SQL Server 2016 之前,无论何时发布任何修补程序或累积更新,查询优化器的改进都不会在 SQL Server 中自动生效。

    但是,从 SQL Server 2016 开始,所有查询优化器的改进现在都基于兼容性级别。

    如果您使用的是 SQL Server 2016 并且您的兼容性级别设置为 SQL Server 2016 (130),则可以放心地忽略它。可以开可以关,没关系。

    SQL Server query optimizer hotfix trace flag 4199 servicing model

    在 SQL Server 2016 中,对 SQL Server 早期版本所做的跟踪标志 4199 修补程序将在数据库 COMPATIBILITY_LEVEL 130 下启用,而不启用跟踪标志 4199。

    最新的兼容级别已启用跟踪标志 4199 下的所有先前修复。这意味着将数据库升级到最新的兼容级别并删除跟踪标志 4199 仍会启用所有修复

    最后一点,跟踪标志 4199 页面上的以下句子表明新的热修复可能需要 4199 或“查询优化器修复”=ON 才能生效。在 SQL 2017 (CU13) {兼容性 140} 中测试新的数据库版本会发现默认值为 OFF。

    跟踪标志 4199 将用于通过使用 130 兼容级别为数据库发布任何未来的 SQL Server 2016 修补程序。

    【讨论】:

    • 对。除了 TSQL 解析器之外,数据库兼容级别现在还控制查询优化器的行为。如果您想将它们分离,请使用 QUERY_OPTIMIZER_HOTFIXES 数据库选项来选择最新的查询优化器行为,而不需要由数据库兼容级别控制的其他行为更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多