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

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

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

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

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

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

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

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

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


person James    schedule 14.11.2012    source источник
comment
сколько времени сейчас выполняется запрос? и какое целевое время вы хотели бы?   -  person Jimbo    schedule 14.11.2012
comment
У вас есть какие-либо индексы, определенные для таблиц? Кто они такие? Как они относятся к запросам? Возможно, вам просто нужно настроить индексацию.   -  person Oded    schedule 14.11.2012
comment
Вы просмотрели план запроса, чтобы увидеть, какая часть запроса выполняется медленно? Кроме того, какая версия SQL Server.   -  person Jeff Siver    schedule 14.11.2012
comment
Запрос занимает максимум около 8-10 секунд, как сейчас (для больших наборов данных). Оба исправления сокращают это время до максимум 2-3 секунд, причем большинство из них работает менее секунды.   -  person James    schedule 14.11.2012
comment
Текущий запрос использует наши индексы (почти всегда использует кластеризованные индексы). Как только это будет выпущено в дикой природе, оно будет работать как на SQL Server 05, так и на 08, а скоро появится и 12.   -  person James    schedule 14.11.2012


Ответы (1)


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

  1. временные таблицы обеспечивают воспроизводимую производительность при условии, что они не оказывают чрезмерной нагрузки на базу данных tempdb с точки зрения увеличения размера и производительности — вам нужно будет отслеживать эти
  2. подсказки sql могут перестать быть эффективными из-за других изменений таблицы/индекса в будущем
  3. не забудьте очистить временные таблицы, когда закончите.
person Jimbo    schedule 14.11.2012
comment
Спасибо за отзыв. У нас в запросах нет sql без sargable. - person James; 14.11.2012