Какие исправления включены подсказкой ENABLE_QUERY_OPTIMIZER_HOTFIXES в sql server 2016? - PullRequest
1 голос
/ 20 марта 2019

Я обнаружил, что подсказка запроса 'ENABLE_QUERY_OPTIMIZER_HOTFIXES' значительно повышает точность оценки мощности в моей базе данных Azure SQL Server 2016 с уровнем совместимости 130 и «Оценка наследственной мощности = Выкл».

Мой вопрос: как я могу увидеть, какие "исправления" переключает этот запрос? (Я понимаю, что эта подсказка должна включать любое исправление, выпущенное «RTM-сервер после SQL Server 2016», но я нигде не могу найти список этих исправлений.)

Я бы хотел понять причину этой проблемы, и это мое лучшее руководство на данный момент.

Контекст

Приведенный ниже запрос возвращает 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 строки.

С подсказкой СЕ предсказывает 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 Ответ

1 голос
/ 20 марта 2019

QUERY_OPTIMIZER_HOTFIXES

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

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

Флаг трассировки 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*

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

Один из перечисленных выше

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...