Какие исправления включены подсказкой ENABLE_QUERY_OPTIMIZER_HOTFIXES в sql server 2016?

#sql-server

#sql-server

Вопрос:

Я обнаружил, что подсказка запроса ‘ENABLE_QUERY_OPTIMIZER_HOTFIXES’ значительно повышает точность оценки мощности в моей базе данных Azure sql server 2016 с уровнем совместимости 130 и ‘Устаревшей оценкой мощности = Выкл.’.

Мой вопрос: Как я могу увидеть, какие «исправления» переключает эта подсказка запроса? (Я понимаю, что эта подсказка должна включить любое исправление, выпущенное «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 является значением RANGE_HI_KEY для статистики IX_RegistrationEventID и имеет EQ_ROWS = 17100.22

Ответ №1:

QUERY_OPTIMIZER_HOTFIXES

Включает или отключает исправления для оптимизации запросов независимо от уровня совместимости базы данных. Значение по умолчанию выключено, что отключает исправления оптимизации запросов, которые были выпущены после того, как для определенной версии был введен наивысший доступный уровень совместимости (после RTM). Установка этого параметра в ON эквивалентна включению флага трассировки 4199.

И согласно документу: флаг трассировки исправления оптимизатора запросов SQL Server 4199 модель обслуживания:

Флаг трассировки 4199 использовался для сбора исправлений, которые должны были быть включены по умолчанию в будущей версии, тогда как другие флаги трассировки использовались для ситуаций, в которых исправление не должно было быть включено по умолчанию в текущей форме. Начиная с SQL Server 2016 RTM, параметр database 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*
  

Мой вопрос: Как я могу увидеть, какие «исправления» переключает эта подсказка запроса?

Одно из исправлений из приведенного выше списка

(Я понимаю, что эта подсказка должна включать любое исправление, выпущенное «после sql server 2016 RTM»

Да, это правильно, поскольку QUERY_OPTIMIZER_HOTFIXES имеет флаг трассировки 4199, который выполняется на уровне базы данных

Достойная компиляция обнаруженных флагов трассировки:https://github.com/ktaranov/sqlserver-kit/blob/master/SQL Server Trace Flag.md

Это показывает, что 4136-4139 были введены во время SQL Server 2016 с пакетом обновления 1, возможно, те четыре, которые вы ищете