Оптимизация запросов SQL Server с использованием советов по соединению

У нас есть запрос в нашей системе, который был проблемой с количеством логических чтений, которые он использует. Запрос выполняется достаточно часто (несколько раз в день), но он по своей природе является отчетом (т. Е. Сбор данных не является транзакционным).

После того, как пара людей посмотрела на него, мы обдумываем несколько разных вариантов.

  1. Используя OPTION (FORCE ORDER) и несколько подсказок MERGE JOIN, вы получите оптимизатор для более эффективной обработки данных (по крайней мере, для данных, которые были протестированы).

  2. Использование временных таблиц, чтобы разбить запрос, чтобы оптимизатор не имел дело с очень большим запросом, который позволяет ему обрабатывать его более эффективно.

На самом деле у нас нет возможности сделать существенное изменение схемы или что-то еще, так как настройка запроса является своего рода объединяющей точкой для решения этой проблемы.

Опция подсказок запроса работает немного лучше, чем другая, но на данный момент оба варианта приемлемы с точки зрения производительности.

Вопрос в том, что бы вы предпочли? Подсказки к запросу рассматриваются как немного опасные, поскольку мы переопределяем оптимизатор и т. Д. Решение для временной таблицы необходимо записать в базу данных tempdb и т. Д.

В прошлом мы могли видеть значительный прирост производительности, используя временные таблицы в наших больших отчетных запросах, но обычно это было для запросов, которые выполняются реже, чем этот запрос.

1 ответ

Решение

Если вы исчерпали оптимизацию с помощью индексов и удалили не SARGABLE sql, тогда я рекомендую перейти к параметру временных таблиц:

  1. временные таблицы обеспечивают воспроизводимую производительность, при условии, что они не оказывают чрезмерного давления на базу данных tempdb с точки зрения увеличения размера и производительности - вам нужно будет контролировать эти
  2. SQL-подсказки могут перестать действовать из-за других изменений таблиц / индексов в будущем
  3. не забудьте очистить временные таблицы, когда вы закончите.
Другие вопросы по тегам