#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, возможно, те четыре, которые вы ищете