У нас есть запрос в нашей системе, который был проблемой из-за количества логических операций чтения, которые он использует. Запрос выполняется достаточно часто (несколько раз в день), но носит отчетный характер (т.е. сбор данных, он не транзакционный).
После того, как несколько человек посмотрели на него, мы обдумываем несколько различных вариантов.
Использование OPTION (FORCE ORDER) и нескольких подсказок MERGE JOIN, чтобы заставить оптимизатор обрабатывать данные более эффективно (по крайней мере, на проверенных данных).
Использование временных таблиц для разбивки запроса, чтобы оптимизатор не имел дело с очень большим запросом, что позволяет ему обрабатывать его более эффективно.
На самом деле у нас нет возможности серьезно изменить схему или что-то еще, настройка запроса является своего рода объединяющей точкой для этой проблемы.
Параметр подсказок запроса работает немного лучше, чем другой вариант, но оба варианта приемлемы с точки зрения производительности на данный момент.
Так что вопрос в том, что бы вы предпочли? Подсказки запроса считаются немного опасными, потому что мы переопределяем оптимизатор и т. д. Решение временной таблицы необходимо записать в базу данных tempdb и т. д.
В прошлом мы могли видеть значительный прирост производительности, используя временные таблицы в наших более крупных запросах отчетов, но обычно это было для запросов, которые выполняются реже, чем этот запрос.