Поделиться через


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

Область применения:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLБаза данных SQL в Microsoft Fabric

Внимание

подсказки хранилища запросов предоставляют более удобный метод для формирования планов запросов без изменения кода приложения. Подсказки для Query Store проще, чем плановые руководства. Подсказки хранилища запросов доступны в базе данных Azure SQL, базе данных SQL в Microsoft Fabric, управляемом экземпляре Azure SQL и в SQL Server 2022 (16.x) и более поздних версиях.

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

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

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

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

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

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

План и руководство OBJECT

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

Предположим, что следующая хранимая процедура, которая принимает параметр @Country_region, относится к приложению базы данных, которое развертывается в связи с базой данных AdventureWorks2022.

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 в запрос. Однако так как хранимая процедура находится в развернутом приложении, напрямую менять код приложения нельзя. Вместо этого можно создать следующее руководство по плану в базе данных AdventureWorks2022.

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)';  

В качестве другого примера рассмотрим следующую инструкцию SQL, отправленную с помощью sp_executesql.

exec sp_executesql N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID =  @so_id', N'@so_id int', @so_id = 43662;  

Чтобы создать уникальный план для каждого выполнения этого запроса, создайте следующую структуру плана и используйте указание запроса OPTION (RECOMPILE) в параметре @hints.

exec sp_create_plan_guide   
@name = N'PlanGuide1_SalesOrders',   
@stmt = N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID =  @so_id',
@type = N'SQL',  
@module_or_batch = NULL,   
@params = N'@so_id int',   
@hints = N'OPTION (recompile)';

Внимание

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

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

образец руководства по плану

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

Вы можете создать руководство по плану TEMPLATE в одной из следующих ситуаций.

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

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

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

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

SELECT FirstName, LastName FROM Person.Person;

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

USE DB1; 
SELECT FirstName, LastName FROM Person.Person;

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

В руководствах по планам на основе SQL или TEMPLATE, 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)