Я обнаружил, что подсказка запроса '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