我发现“ 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。
有所不同! (我知道这种简化查询中的区别并不重要,但是我相信这些差劲的估计使查询优化器在较大,更复杂的查询中选择错误的计划)。
其他发现/注释:
答案 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,也许您正在寻找的那四个