Partilhar via


Criar um guia de plano para consultas parametrizadas

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Um guia de plano TEMPLATE corresponde a consultas independentes que se parametrizam para um formulário especificado.

O exemplo a seguir cria um guia de plano que corresponde a qualquer consulta que se parametriza num formulário especificado e direciona o SQL Server para forçar a parametrização da consulta. As duas consultas a seguir são sintaticamente equivalentes, mas diferem apenas em seus valores literais constantes.

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

Aqui está o guia do plano na forma parametrizada da consulta:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2022.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)';  

No exemplo anterior, o valor para o parâmetro @stmt é a forma parametrizada da consulta. A única maneira confiável de obter esse valor para uso em sp_create_plan_guide é usar o procedimento armazenado do sistema sp_get_query_template. O script a seguir pode ser usado para obter a consulta parametrizada e, em seguida, criar um guia de plano sobre ela.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2022.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)';  

Importante

O valor dos literais constantes no parâmetro @stmt passado para sp_get_query_template pode afetar o tipo de dados escolhido para o parâmetro que substitui o literal. Isso afetará a correspondência do guia de planos. Talvez seja necessário criar mais de um guia de plano para lidar com diferentes intervalos de valores de parâmetros.

Você também pode usar guias de plano TEMPLATE juntamente com guias de plano SQL. Por exemplo, você pode criar um guia de plano TEMPLATE para garantir que uma classe de consultas seja parametrizada. Em seguida, você pode criar um guia de plano SQL na forma parametrizada dessa consulta.