Предположение об объединения в новом оценщике кратности снижает производительность запроса
Эта статья поможет устранить проблемы с производительностью, которые могут возникнуть в SQL Server 2014 и более поздних версиях при компиляции запросов с помощью нового оценщика кратности.
Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 3189675
Симптомы
Рассмотрим следующий сценарий.
- Вы используете SQL Server 2014 или более поздней версии.
- Вы выполняете запрос, содержащий предикаты фильтров соединений и несоединений.
- Запрос компилируется с помощью новой оценки кратности (SQL Server) (New CE).
В этом сценарии происходит снижение производительности запросов.
Эта проблема не возникает, если скомпилировать запрос с помощью устаревшей версии CE.
Причина
С SQL Server 2014 года для уровня совместимости базы данных 120 и выше был введен оценщик новой кратности (New CE). Новая CE изменяет несколько предположений из устаревшей CE в модели, которая используется оптимизатором запросов при оценке кратности для различных операторов и предикатов.
Одно из этих изменений связано с предположением об объединенности.
Устаревшая модель CE предполагает, что пользователи всегда запрашивают существующие данные. Это означает, что для предиката соединения, который включает операцию равного соединения для двух таблиц, соединенные столбцы находятся по обе стороны соединения. При наличии дополнительных предикатов фильтра, не относящихся к соединению, для таблицы соединения устаревшая CE предполагает определенный уровень корреляции для предикатов соединения и предикатов фильтра без соединения. Эта подразумеваемая корреляция называется простой сдерживанием.
Кроме того, в новом CE в качестве корреляции используется базовое содержащееся. Новая модель CE предполагает, что пользователи могут запрашивать данные, которые не существуют. Это означает, что предикаты фильтра в отдельных таблицах могут не сопоставляться друг с другом. Поэтому мы используем вероятностный подход.
Во многих практических сценариях использование предположения о базовом сдерживании создает более качественные оценки. Это, в свою очередь, создает более эффективные варианты плана запроса. Однако в некоторых ситуациях использование предположения простого сдерживания может обеспечить лучшие результаты. В этом случае при использовании нового CE вместо устаревшего ce вы можете столкнуться с менее эффективным выбором плана запроса.
Дополнительные сведения об устранении неполадок, связанных с новым CE, см. в статье Снижение производительности запросов после обновления с SQL Server 2012 года или более ранней версии до 2014 года или более поздней версии.
Разрешение
В SQL Server 2014 и более поздних версиях можно использовать флаг трассировки 9476, чтобы заставить SQL Server использовать допущение простого сдерживания вместо предположения по умолчанию. Если вы можете изменить запрос приложения, лучше использовать подсказку ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
запроса после SQL Server 2016 (13.x) с пакетом обновления 1 (SP1). Дополнительные сведения см. в разделе USE HINT. Например:
SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));
Включение этого флага трассировки или использование указания запроса может улучшить выбор плана запроса без необходимости полностью отменить изменения в устаревшую модель CE, если выполняются следующие условия:
- Вы можете выбрать неоптимальный план запроса, что приводит к снижению общей производительности запросов, содержащих предикаты фильтров соединений и несоединений.
- Вы можете проверить значительную неточность в оценке "кратности соединения" (т. е. фактическое и предполагаемое количество строк, существенно отличающихся).
- Эта неточность не существует при компиляции запросов с помощью устаревшей версии CE.
Этот флаг трассировки можно включить глобально, на уровне сеанса или на уровне запроса.
Примечание.
Неправильное использование флагов трассировки может снизить производительность рабочей нагрузки. Дополнительные сведения см. в разделе Указания (Transact-SQL) — запрос.