Основные сведения о форсировании планов

Подсказка в запросе USE PLAN применяется, чтобы заставить оптимизатор запросов использовать для формирования запроса определенный план. Подсказка USE PLAN работает посредством приема плана запроса, который необходимо использовать в формате XML в качестве аргумента. Подсказку USE PLAN можно использовать для запросов, планы которых замедляют их выполнение, но для которых существует лучший план. Обычный сценарий может использовать запросы, которые хорошо выполнялись в более ранней версии SQL Server, но в обновленной версии выполняются плохо, независимо от того, является ли это обновление пакетом обновления или полной версией обновления. В большинстве случаев обновление предполагает равноценный или более высокий уровень выполнения запросов; однако бывают исключения. Подсказка USE PLAN может быть использована в тех случаях, когда план запроса, выбранный оптимизатором запросов в более ранней версии продукта, является более предпочтительным, чем выбранный после обновления.

Подсказка в запросе USE PLAN может быть использована со структурами плана при устранении неполадок в выполнении запросов в развернутых приложениях. Структуры плана используются для применения подсказок в запросе, когда нельзя или не нужно изменять приложение. Дополнительные сведения о структурах плана см. в разделе Оптимизация запросов в используемых приложениях с помощью структур планов. Дополнительные сведения о подробных сценариях, описывающих принципы применения в запросе подсказки USE PLAN к структурам плана, см. в разделах Сценарий форсирования планов. Создание структуры плана, задающей план запроса и Сценарий форсирования планов. Создание структуры плана для принудительного выполнения плана, полученного из перезаписанного запроса.

Форсирование плана может быть использовано в большинстве типов запросов. К ним относятся запросы к таблицам, кластеризованным и некластеризованным индексам, индексированным представлениям, а также к секционированным таблицам и индексам. Подсказку USE PLAN нельзя указывать в следующих инструкциях языка обработки данных: INSERT, UPDATE MERGE и DELETE. Обратите внимание, что изменения в схеме базы данных, например добавление или удаление индекса, может сделать недействительным план, указанный в подсказке USE PLAN. Если подсказка USE PLAN указана непосредственно в запросе, недействительный план приведет к ошибке при выполнении запроса. Если подсказка USE PLAN указана в структуре плана, недействительный план не приведет к сбою при выполнении запроса; однако план будет скомпилирован без использования подсказки, что не рекомендуется. Если подсказка USE PLAN использована внутри структуры плана, можно использовать функцию sys.fn_validate_plan_guide, чтобы проверить достоверность плана. Основываясь на результатах выполнения функции, можно принять решение об удалении структуры плана и повторной настройке запроса или об изменении структуры базы данных. Например, можно повторно создать индекс, указанный в структуре плана.

Планы запросов, созданные с подсказкой в запросе USE PLAN, кэшируются так же, как и другие планы запросов.

Ограничения форсирования планов

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

При использовании в запросе подсказки USE PLAN для изменения компиляции запроса в развернутом приложении ее следует применять внутри структуры плана, а не посредством прямого внедрения в приложение. Этим можно решить следующие проблемы:

  • Можно изменить или удалить подсказку без повторной компиляции или изменения приложения. В некоторых случаях подсказка USE PLAN, применяемая к выпуску SQL Server, может быть неприменима к будущему пакету обновления или варианту выпуска. Следовательно, может понадобиться изменить или удалить подсказку USE PLAN после развертывания приложения.

  • Можно избежать использования большой подсказки непосредственно в запросе. Это облегчает чтение запроса.

    Важное примечаниеВажно!

    При создании структуры плана, использующего USE PLAN, во время тестирования следует проверить, является ли запрос, план которого необходимо форсировать, запросом, который обычно запрашивается курсором. Планы запросов для курсорных запросов отличаются от планов некурсорных запросов. Таким образом, чтобы создать структуру плана с указанием подсказки USE PLAN, которая может быть применена к запросу, предъявляемому курсором, структура плана должна указывать план исполнения курсора. Дополнительные сведения см. в разделе Использование подсказки USE PLAN в запросах с курсорами.

Форсирование планов не поддерживается для следующих типов запросов:

  • Запросы с динамическими, управляемыми наборами ключей и однонаправленными курсорами. Статические и опережающие курсоры поддерживаются. Дополнительные сведения см. в разделе Использование подсказки USE PLAN в запросах с курсорами.

  • Распределенные запросы.

  • Полнотекстовые запросы.