将固定查询计划应用于计划指南

可以将固定查询计划应用于 OBJECT 或 SQL 类型的计划指南。 当你知道现有执行计划的性能优于优化器为特定查询选择的计划时,应用固定查询计划的计划指南非常有用。

以下示例为简单的即席 SQL 语句创建计划指南。 所需查询计划通过在计划指南中通过 @hints 参数直接指定查询的 XML Showplan 来提供。 该示例首先执行 SQL 语句以在计划缓存中生成计划。 出于此示例的目的,假定生成的计划是所需的计划,不需要其他查询优化。 查询的 XML Showplan 是通过查询sys.dm_exec_query_statssys.dm_exec_sql_textsys.dm_exec_text_query_plan动态管理视图获取的,并将其分配给变量@xml_showplan。 然后,该 @xml_showplan 变量被传递到 @hints 参数中的 sp_create_plan_guide 语句。 或者,可以使用 sp_create_plan_guide_from_handle 存储过程从计划缓存中的查询计划创建计划指南。

USE AdventureWorks2012;  
GO  
SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;  
GO  
DECLARE @xml_showplan nvarchar(max);  
SET @xml_showplan = (SELECT query_plan  
    FROM sys.dm_exec_query_stats AS qs   
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st  
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp  
    WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%');  
  
EXEC sp_create_plan_guide   
    @name = N'Guide1_from_XML_showplan',   
    @stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = @xml_showplan;  
GO