Usando o SQL Server Profiler para criar e testar guias de plano
Ao criar um guia de plano, você poderá usar o SQL Server Profiler para capturar o texto de consulta exato a ser usado no argumento statement_text do procedimento armazenado sp_create_plan_guide. Isto ajuda a certificar que o guia de plano será correspondido à consulta no tempo de compilação. Depois que o guia de plano é criado, o SQL Server Profiler também pode ser usado para testar se o guia de plano está, de fato, sendo correspondido à consulta. De maneira geral, você deve testar guias de plano usando o SQL Server Profiler para verificar se a sua consulta está sendo correspondida ao guia de plano.
Capturando texto de consulta usando o SQL Server Profiler
Se você executar uma consulta e capturar o texto exatamente como foi submetido ao SQL Server usando o SQL Server Profiler, será possível criar um guia de plano do tipo SQL ou TEMPLATE que corresponderá exatamente ao texto de consulta. Isto certifica que o guia de plano seja usado pelo otimizador de consulta.
Considere a seguinte consulta, que é submetida por um aplicativo como um lote autônomo:
SELECT COUNT(*) AS c
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID
WHERE h.OrderDate >= '20000101' AND h.OrderDate <='20050101';
Suponha que você queira que essa consulta execute uma operação de mescla de junção, mas SHOWPLAN indica que a consulta não está usando uma mescla de junção. Você não pode alterar a consulta diretamente no aplicativo, então, em vez disso, cria um guia de plano para especificar que a dica de consulta MERGE JOIN seja acrescentada à consulta no tempo de compilação.
Para capturar o texto da consulta exatamente como o SQL Server o recebe, execute as seguintes etapas:
Inicie um rastreamento de SQL Server Profiler, certificando-se de que o tipo de evento do SQL:BatchStarting esteja selecionado.
Faça com que o aplicativo execute a consulta.
Pause o rastreamento de SQL Server Profiler.
Clique no evento SQL:BatchStarting que corresponde à consulta.
Clique com o botão direito do mouse e selecione Extrair Dados de Eventos.
Importante Não tente copiar o texto em lote selecionando-o no painel inferior da janela de rastreamento do Profiler. Isto pode fazer com que o guia de plano que você criou não corresponda ao lote original.
Salve os dados de evento em um arquivo. Este é o texto em lote.
Abra o arquivo de texto em lote no Bloco de Notas e copie o texto no buffer copiar e colar.
Crie o guia de plano e cole o texto copiado dentro das aspas ( “especificadas para o argumento@ stmt. Você deve escapar todas as aspas únicas no argumento @ stmt, precedendo-as com outra aspa única. Tenha cuidado para não adicionar ou remover nenhum outro caractere quando você inserir essas aspas individuais. Por exemplo, a literal de data '20000101' deve ser delimitada como 20000101".
Aqui está o guia de plano:
EXEC sp_create_plan_guide
@name = N'MyGuide1',
@stmt = N'<paste the text copied from the batch text file here>',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MERGE JOIN)';
Testando guias de plano usando o SQL Server Profiler
Para verificar se um guia de plano está sendo correspondido a uma consulta, execute as seguintes etapas:
Inicie um novo rastreamento SQL Server Profiler e verifique se o tipo de evento Plano de Execução XML está selecionado (localizado abaixo do nó Desempenho).
Faça com que o aplicativo execute a consulta.
Pause o rastreamento de SQL Server Profiler.
Localize o evento Plano de Execução XML para a consulta afetada.
Se o guia de plano for do tipo OBJECT ou SQL, verifique se o evento Plano de Execução XML contém os atributos PlanGuideDB e PlanGuideName para o guia de plano que você espera que corresponda à consulta. Ou, no caso de um guia de plano de TEMPLATE, verifique se o evento Plano de Execução XML contém os atributos TemplatePlanGuideDB e TemplatePlanGuideName para o guia de plano esperada. Isto verifica se o guia de plano está funcionando. Esses atributos estão contidos no elemento <StmtSimple> do plano.
Consulte também