SQL Server 2016中的ENABLE_QUERY_OPTIMIZER_HOTFIXES提示启用了哪些修复程序?

时间:2019-03-20 14:42:47

标签: sql-server

我发现“ ENABLE_QUERY_OPTIMIZER_HOTFIXES”查询提示极大地提高了我的azure sql server 2016数据库的基数估计准确性,其兼容性级别为130,并且“ Legacy Cardinality Estimation = Off”。

我的问题:如何查看此查询提示切换了哪些“修复”? (我知道此提示应启用任何已发布的“ post sql server 2016 RTM”修复程序,但在任何地方都找不到这些修复程序的列表。)

我想了解此问题的根本原因,这是迄今为止我最好的线索。

上下文

以下查询返回15,581个结果。

select 
    RegistrationId from Registrations 
where 
    EventId = 1234
    and IsDeleted = 0
OPTION(
--USE HINT('ENABLE_QUERY_OPTIMIZER_HOTFIXES'), 
recompile)

没有,“ ENABLE_QUERY_OPTIMIZER_HOTFIXES”提示CE预测有124行。

带有的提示是CE预测为16,750。

有所不同! (我知道这种简化查询中的区别并不重要,但是我相信这些差劲的估计使查询优化器在较大,更复杂的查询中选择错误的计划)。

其他发现/注释:

  • 将IsDeleted谓词(和IsDeleted!= 1)取反将返回“好”估计值(16,750)
  • 查询提示“ FORCE_LEGACY_CARDINALITY_ESTIMATION”返回“良好”估算值(16,750)
  • 删除IsDeleted谓词将返回“好”估计值(17,108)
  • 统计信息是最新的。
  • EventID和IsDeleted是多列非聚集索引(IX_RegistrationEventID)的一部分
  • EventID = 1234是IX_RegistrationEventID统计信息的RANGE_HI_KEY值,其EQ_ROWS = 17100.22

1 个答案:

答案 0 :(得分:1)

  

QUERY_OPTIMIZER_HOTFIXES

     

启用或禁用查询优化修补程序,无论   数据库的兼容性级别。默认为OFF,即   禁用在之后发布的查询优化修补程序   针对特定对象引入了最高可用兼容性级别   版本(RTM后)。 将此设置为ON等效于启用跟踪   标记4199。

根据文件:SQL Server query optimizer hotfix trace flag 4199 servicing model

  

Trace标志4199用于收集旨在   在将来的版本中默认为启用,而其他跟踪标志   用于不打算成为修复程序的情况   默认为当前形式。从SQL Server 2016 RTM开始,   数据库COMPATIBILITY_LEVEL设置将用于启用跟踪标志   默认情况下,与4199有关的修补程序为打开状态。本文介绍了   如何影响计划的修复程序的机制和策略   适用于SQL Server 2016及更高版本。

     

下表列出了用于查询的跟踪标志   引入跟踪标志4199之前的处理器修补程序:

Microsoft Knowledge Base article    Trace flag
318530                                 4101
940128                                 4102
919905                                 4103
920346                                 4104
920347                                 4105
922438                                 4106
923849                                 4107
926024                                 4108
926773                                 4109
933724                                 4110
934065                                 4111
946793                                 4115
950880                                 4116
948445                                 4117
942659                                 4119
953948                                 4120
942444                                 4121
946020                                 4122
948248                                 4124
949854                                 4125
959013                                 4126
953569                                 4127
955694                                 
957872                                 4128
958547                                 4129
956686                                 4131
958006                                 4133
960770                                 4135*
  

我的问题:如何查看此查询提示切换了哪些“修复”?

上面列表中的一个

  

(我知道此提示应启用任何已发布的修复程序'post sql   服务器2016 RTM'

是的,这是正确的,因为QUERY_OPTIMIZER_HOTFIXES是在数据库级别运行的跟踪标志4199

发现的跟踪标志的不错的汇编:https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Trace%20Flag.md

它表明在SQL Server 2016 SP1期间引入了4136-4139,也许您正在寻找的那四个