Partilhar via


Especificar o comportamento de parametrização da consulta usando guias de plano

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

Quando a opção de banco de dados PARAMETERIZATION é definida como SIMPLE, o otimizador de consulta do SQL Server pode optar por parametrizar as consultas. Isso significa que todos os valores literais contidos em uma consulta são substituídos por parâmetros. Este processo é conhecido como parametrização simples. Quando a parametrização SIMPLE está em vigor, você não pode controlar quais consultas são parametrizadas e quais não são. No entanto, você pode especificar que todas as consultas em um banco de dados sejam parametrizadas definindo a opção de banco de dados PARAMETERIZATION como FORCED. Este processo é conhecido como parametrização forçada.

Você pode substituir o comportamento de parametrização de um banco de dados usando guias de plano das seguintes maneiras:

  • Quando a opção de banco de dados PARAMETERIZATION é definida como SIMPLE, você pode especificar que a parametrização forçada é tentada em uma determinada classe de consultas. Para fazer isso, crie um guia de plano TEMPLATE na forma parametrizada da consulta e especifique a pista de consulta PARAMETERIZATION FORCED no procedimento armazenado sp_create_plan_guide. Você pode considerar esse tipo de guia de plano como uma maneira de habilitar a parametrização forçada apenas em uma determinada classe de consultas, em vez de todas as consultas. Para obter mais informações sobre parametrização simples, consulte o Query Processing Architecture Guide.

  • Quando a opção de banco de dados PARAMETERIZATION é definida como FORCED, você pode especificar que, para uma determinada classe de consultas, apenas a parametrização simples é tentada, não a parametrização forçada. Para fazer isso, crie um guia de plano TEMPLATE na forma parametrizada forçada da consulta e especifique a dica de consulta PARAMETERIZATION SIMPLE no sp_create_plan_guide. Para obter mais informações sobre parametrização forçada, consulte o Query Processing Architecture Guide.

Considere a seguinte consulta no banco de dados AdventureWorks2025:

SELECT pi.ProductID, SUM(pi.Quantity) AS Total  
FROM Production.ProductModel AS pm   
    INNER JOIN Production.ProductInventory AS pi   
        ON pm.ProductModelID = pi.ProductID   
WHERE pi.ProductID = 101   
GROUP BY pi.ProductID, pi.Quantity HAVING SUM(pi.Quantity) > 50;  

Como administrador de banco de dados, você determinou que não deseja habilitar a parametrização forçada em todas as consultas no banco de dados. No entanto, você deseja evitar custos de compilação em todas as consultas que são sintaticamente equivalentes à consulta anterior, mas diferem apenas em seus valores literais constantes. Em outras palavras, você deseja que a consulta seja parametrizada para que um plano de consulta para esse tipo de consulta seja reutilizado. Nesse caso, conclua as seguintes etapas:

  1. Recupere a forma parametrizada da consulta. A única maneira segura de obter esse valor para uso em sp_create_plan_guide é usando o procedimento armazenado do sistema sp_get_query_template.

  2. Crie o guia de plano na forma parametrizada da consulta, especificando a dica de consulta PARAMETERIZATION FORCED.

    Importante

    Como parte da parametrização de uma consulta, o SQL Server atribui um tipo de dados aos parâmetros que substituem os valores literais, dependendo do valor e do tamanho do literal. O mesmo processo ocorre com o valor dos literais constantes passados para o parâmetro de saída @stmt de sp_get_query_template. Como o tipo de dados especificado no argumento @params de sp_create_plan_guide deve corresponder ao da consulta conforme é parametrizado pelo SQL Server, talvez seja necessário criar mais de um guia de plano para cobrir o intervalo completo de valores de parâmetros possíveis para a consulta.

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 pi.ProductID, SUM(pi.Quantity) AS Total   
      FROM Production.ProductModel AS pm   
      INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID   
      WHERE pi.ProductID = 101   
      GROUP BY pi.ProductID, pi.Quantity   
      HAVING sum(pi.Quantity) > 50',  
    @stmt OUTPUT,   
    @params OUTPUT;  
EXEC sp_create_plan_guide   
    N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

Da mesma forma, em um banco de dados no qual a parametrização forçada já está habilitada, você pode certificar-se de que a consulta de exemplo, e outras que são sintaticamente equivalentes, exceto por seus valores literais constantes, são parametrizadas de acordo com as regras de parametrização simples. Para fazer isso, especifique PARAMETERIZATION SIMPLE em vez de PARAMETERIZATION FORCED na cláusula OPTION.

Observação

O plano TEMPLATE orienta a correspondência das instruções às consultas enviadas em lotes que contêm apenas uma única instrução. As instruções dentro de blocos de várias instruções não são elegíveis para serem correspondidas pelos guias de plano TEMPLATE.