パラメーター化クエリのプラン ガイドの作成Create a Plan Guide for Parameterized Queries

適用対象: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

TEMPLATE プラン ガイドでは、指定した形式にパラメーター化されたスタンドアロン クエリが照合されます。A TEMPLATE plan guide matches stand-alone queries that parameterize to a specified form.

次の例では、指定されたフォームにパラメーター化されるクエリに適合するプラン ガイドを作成し、 SQL ServerSQL Server に対してクエリのパラメーター化を強制的に実行させます。The following example creates a plan guide that matches any query that parameterizes to a specified form, and directs SQL ServerSQL Server to force parameterization of the query. 次の 2 つのクエリは構文的には同じですが、定数リテラル値のみが異なります。The following two queries are syntactically equivalent, but differ only in their constant literal values.

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45639;  
  
SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45640;  

パラメーター化形式のクエリに対するプラン ガイドは次のようになります。Here is the plan guide on the parameterized form of the query:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
                  ON h.SalesOrderID = d.SalesOrderID  
              WHERE h.SalesOrderID = @0',  
    @type = N'TEMPLATE',  
    @module_or_batch = NULL,  
    @params = N'@0 int',  
    @hints = N'OPTION(PARAMETERIZATION FORCED)';  

この例では、 @stmt パラメーターの値は、パラメーター化形式のクエリになっています。In the previous example, the value for the @stmt parameter is the parameterized form of the query. この値を取得して sp_create_plan_guide で使用できるようにするには、 sp_get_query_template システム ストアド プロシージャを使用するのが唯一信頼できる方法です。The only reliable way to obtain this value for use in sp_create_plan_guide is to use the sp_get_query_template system stored procedure. 次のスクリプトを使用すると、パラメーター化クエリを取得してそのクエリに対してプラン ガイドを作成することができます。The following script can be used both to obtain the parameterized query and then create a plan guide on it.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
          ON h.SalesOrderID = d.SalesOrderID  
      WHERE h.SalesOrderID = 45639;',  
    @stmt OUTPUT,   
    @params OUTPUT  
EXEC sp_create_plan_guide N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

重要

@stmt に渡される sp_get_query_template パラメーターの定数リテラルの値は、リテラルを置き換えるパラメーターで選択されるデータ型に影響する場合があります。The value of the constant literals in the @stmt parameter passed to sp_get_query_template might affect the data type that is chosen for the parameter that replaces the literal. この値は、プラン ガイドの適合にも影響します。This will affect plan guide matching. 場合によっては、異なるパラメーター値範囲に対応する複数のプラン ガイドを作成する必要があります。You may have to create more than one plan guide to handle different parameter value ranges.

TEMPLATE プラン ガイドを SQL プラン ガイドと併用することもできます。You can also use TEMPLATE plan guides together with SQL plan guides. たとえば、TEMPLATE プラン ガイドを作成することで、特定のクラスのクエリについて確実にパラメーター化を行うことができます。For example, you can create a TEMPLATE plan guide to make sure that a class of queries is parameterized. これにより、そのパラメーター化された形式のクエリに対して SQL プラン ガイドを作成できます。You can then create an SQL plan guide on the parameterized form of that query.