Partilhar via


Como o SQL Server efetua a correspondência entre guias de plano e consultas

O SQL Server efetua a correspondência entre guias de plano do tipo OBJECT e consultas que aparecem no procedimento armazenado, gatilho ou função (módulo) nomeados no argumento @module_or_batch do procedimento armazenado sp_create_plan_guide. Se houver um guia de plano no módulo, o guia de plano será comparado à consulta especificada.

Para consultas enviadas em lotes, o SQL Server compara os guias de plano a elas tentando primeiro efetuar a correspondência entre a consulta e um guia de plano com base em SQL e depois tentando parametrizar a consulta e tentando novamente. A ilustração a seguir fornece uma visão geral desse processo.

Como o SQL Server efetua a correspondência entre guias de plano e consultas

  1. O otimizador de consultas do SQL Server reconhece um lote executado como uma solicitação para compilar cada instrução dentro do lote.

  2. Para uma instrução específica dentro do lote, o SQL Server tenta efetuar a correspondência entre a instrução e um guia de plano com base em SQL cujo argumento @ module_or_batch corresponde ao argumento do texto em lote de entrada, incluindo qualquer valor literal constante e cujo argumento @stmt também corresponda à instrução no lote. Se esse tipo de guia de plano existir e a correspondência tiver êxito, o texto de instrução será modificado para incluir as dicas de consulta especificadas no guia de plano. A instrução é compilada adequadamente.

  3. Se não for feita a correspondência entre um guia de plano e a instrução na etapa 2, o SQL Server tentará parametrizar a instrução usando parametrização forçada. Nessa etapa, a parametrização pode falhar por qualquer um dos seguintes motivos:

    1. A instrução já está parametrizada ou contém variáveis locais.

    2. A opção SET do bando de dados PARAMETERIZATION SIMPLE é aplicada (configuração padrão) e não há nenhum guia de plano do tipo TEMPLATE que se aplica à instrução e especifica a dica de consulta PARAMETERIZATION FORCED.

    3. Existe um guia de plano do tipo TEMPLATE que se aplica à instrução e especifica a dica de consulta PARAMETERIZATION SIMPLE.

    Se a parametrização forçada tiver êxito, o SQL Server tentará efetuar a correspondência entre o formulário parametrizado da instrução e um guia de plano do tipo SQL, criado na instrução parametrizada. Se esse tipo de guia de plano existir e a correspondência tiver êxito, o texto de instrução será modificado para incluir as dicas de consulta especificadas no guia de plano. A instrução é compilada adequadamente. Se não for feita a correspondência com nenhum guia de plano, a instrução parametrizada será compilada sem ser modificada primeiro por um guia de plano.

  4. Se a parametrização falhar na etapa 3, o SQL Server tentará parametrizar a instrução novamente. Dessa vez, o SQL Server aplica o comportamento de parametrização simples padrão. A consulta resultante é compilada diretamente. Não é feita a correspondência entre guias de plano e resultados de parametrização simples.

    ObservaçãoObservação

    A dica de consulta RECOMPILE é ignorada em guias de plano do tipo SQL que se aplicam a consultas parametrizadas por meio de uma parametrização forçada ou simples. Um aviso também é emitido.