Руководства планов

Структуры планов позволяют оптимизировать производительность запросов, если невозможно или нежелательно непосредственно изменять текст фактически имеющегося запроса в SQL Server 2012. Структуры планов влияют на оптимизацию запросов путем присоединения к ним указаний запроса или постоянного плана запроса. Структуры планов полезны, когда небольшое подмножество запросов в приложении базы данных стороннего разработчика выполняются не так, как ожидается. В структуре плана задается инструкция Transact-SQL, которую нужно оптимизировать, и либо предложение OPTION, содержащее указания запросов, либо конкретный план запроса, с помощью которого планируется оптимизировать запрос. При выполнении запроса SQL Server сопоставляет инструкцию Transact-SQL со структурой плана и присоединяет предложение OPTION к запросу во время выполнения или использует указанный план запроса.

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

ПримечаниеПримечание

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

Типы структур планов

Могут быть созданы структуры планов следующих типов.

  • OBJECT, руководство плана
    Структура плана OBJECT соответствует запросам, выполняемым в контексте хранимых процедур языка Transact-SQL, определяемых пользователем скалярных функций, определяемых пользователем функций с несколькими инструкциями, возвращающих табличные значения, и триггеров DML.

    Предположим, что следующая хранимая процедура, которая принимает параметр @Country\_region, находится в приложении базы данных, развертываемом применительно к базе данных AdventureWorks2012 :

    CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country_region nvarchar(60))
    AS
    BEGIN
        SELECT *
        FROM Sales.SalesOrderHeader AS h, Sales.Customer AS c, 
            Sales.SalesTerritory AS t
        WHERE h.CustomerID = c.CustomerID
            AND c.TerritoryID = t.TerritoryID
            AND CountryRegionCode = @Country_region
    END;
    

    Предполагается, что эта хранимая процедура скомпилирована и оптимизирована для значения @Country\_region = N'AU' (Австралия). Но из Австралии поступает относительно небольшое количество заказов на продажу, поэтому производительность снижается, если запрос выполняется с использованием значений параметров, относящихся к тем странам, где имеется большее количество заказов на продажу. Так как страна, из которой поступает больше всего заказов на продажу, — США, план запроса, сформированный для значения @Country\_region = N'US', вероятно, обеспечит лучшую производительность для всех возможных значений параметра @Country\_region.

    Чтобы решить эту проблему, измените хранимую процедуру и добавьте указание OPTIMIZE FOR в запрос. Однако так как хранимая процедура находится в развернутом приложении, напрямую менять код приложения нельзя. Вместо этого можно создать следующую структуру плана в базе данных AdventureWorks2012 .

    sp_create_plan_guide 
    @name = N'Guide1',
    @stmt = N'SELECT *FROM Sales.SalesOrderHeader AS h,
            Sales.Customer AS c,
            Sales.SalesTerritory AS t
            WHERE h.CustomerID = c.CustomerID 
                AND c.TerritoryID = t.TerritoryID
                AND CountryRegionCode = @Country_region',
    @type = N'OBJECT',
    @module_or_batch = N'Sales.GetSalesOrderByCountry',
    @params = NULL,
    @hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';
    

    При выполнении запроса, указанного в инструкции sp_create_plan_guide, этот запрос изменяется до оптимизации: в него добавляется предложение OPTIMIZE FOR (@Country = N''US'').

  • Структура плана SQL
    Структура плана SQL соответствует запросам, выполняющимся в контексте изолированных инструкций Transact-SQL и пакетов, не входящих ни в один объект базы данных. Структуры планов SQL также можно использовать для соответствия запросам с параметрами. Структуры планов SQL применяются к изолированным инструкциям Transact-SQL и пакетам. Часто эти инструкции передаются приложением с помощью хранимой процедуры sp_executesql. Например, рассмотрим следующий изолированный пакет:

    SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;
    

    Чтобы избежать создания параллельного плана выполнения для этого запроса, создайте приведенную ниже структуру плана и присвойте указанию запроса MAXDOP значение 1 в параметре @hints.

    sp_create_plan_guide 
    @name = N'Guide2', 
    @stmt = N'SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC',
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (MAXDOP 1)';
    
    Важное примечаниеВажно!

    Значения, передаваемые для аргументов @module_or_batch и @params инструкции sp_create_plan guide, должны соответствовать тексту настоящего запроса. Дополнительные сведения см. в разделах sp_create_plan_guide (Transact-SQL) и Использование приложения SQL Server Profiler для создания и проверки руководств планов.

    Кроме того, структуры планов SQL можно создавать для запросов с той же параметризованной формой, если значением параметра базы данных PARAMETERIZATION является SET или FORCED либо если создана структура плана TEMPLATE, определяющая, что класс запросов должен быть параметризован.

  • TEMPLATE, структура плана
    Структура плана TEMPLATE соответствует изолированным инструкциям с параметрами. Эти структуры планов используются для замещения текущего параметра PARAMETERIZATION инструкции SET базы данных для класса запросов.

    Структуры планов TEMPLATE создаются в одной из следующих ситуаций.

    • Параметр базы данных PARAMETERIZATION инструкции SET хранит значение FORCED, но есть запросы, которые желательно скомпилировать в соответствии с правилами простой параметризации.

    • Параметр базы данных PARAMETERIZATION задается с помощью инструкции SET равным SIMPLE (настройка по умолчанию), но желательно произвести попытку принудительной параметризации определенного класса запросов.

Требования по соответствию для структур планов

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

SELECT FirstName, LastName FROM Person.Person;

Только руководства планов в базе данных AdventureWorks2012 подлежат сопоставлению с этим запросом. Но если AdventureWorks2012 является текущей базой данных и выполняются нижеследующие инструкции:

USE DB1;

SELECT FirstName, LastName FROM Person.Person;

Для согласования с запросом применимы только структуры планов в DB1, поскольку запрос выполняется в контексте DB1.

В руководствах планов, основанных на SQL или шаблонах, SQL Server сопоставляет с запросом значения аргументов @module\_or\_batch и @params, сравнивая эти два значения посимвольно. Это означает, что необходимо предоставить текст точно в том же виде, в каком SQL Server получит его в действительном пакете.

Если задан параметр @type = «SQL», а параметр @module\_or\_batch установлен равным NULL, то значение параметра @module\_or\_batch устанавливается равным @stmt. Из этого следует, что значение для statement_text должно быть предоставлено в идентичном формате, символ к символу, поскольку оно передается в SQL Server. Для упрощения соответствия формата внутренние преобразования не выполняются.

Если к инструкции могут быть применены и обычная структура плана (SQL или OBJECT), и структура плана TEMPLATE, то используется только обычная структура плана.

ПримечаниеПримечание

Пакет, содержащий инструкцию, для которой необходимо создать структуру плана, не может содержать инструкцию USE database.

Влияние структуры плана на кэш планов

Создание структуры плана в модуле стирает план запроса для этого модуля из кэша планов. Создание структуры плана типа OBJECT или SQL в потоке стирает план запроса для потока, который имеет такое же значение хеш-функции. Создание структуры плана типа TEMPLATE стирает все потоки с одним оператором из кэша планов через базу данных.

Связанные задачи

Задача

Раздел

Описано, как создать структуру плана.

Создание структуры плана

Описано, как создать структуру плана для параметризованных запросов.

Создание руководства плана для параметризованных запросов

Описано, как управлять режимом параметризации запроса с использованием структур планов.

Указание механизма параметризации запросов с помощью структур плана

Описано, как включить постоянный план запроса в структуру плана.

Применение фиксированного плана запроса к структуре плана

Описано, как задать указания запросов в структуре плана.

Присоединение указаний запросов к структуре плана

Описано, как просматривать свойства структуры плана.

Просмотр свойств структуры плана

Описано, как использовать профилировщик SQL Server для создания и проверки структур планов.

Использование приложения SQL Server Profiler для создания и проверки руководств планов

Описано, как проверять структуры планов.

Проверка руководств плана после обновления

См. также

Справочник

sp_create_plan_guide (Transact-SQL)

sp_create_plan_guide_from_handle (Transact-SQL)

Хранимая процедура sp_control_plan_guide (Transact-SQL)

sys.plan_guides (Transact-SQL)

sys.fn_validate_plan_guide (Transact-SQL)