Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como determinar o que está compilando no SQL Server


Quando tive que analisar problemas com o cache do plano/recompilação excessiva de consultas no passado, segui as orientações fornecidas no whitepaper da Microsoft 'Planejar cache no SQL Server 2008' e eu sugiro fortemente a leitura disso, pois abrange o cache de planos, reutilização de planos de consulta, causas de recompilações, identificação de recompilações e outros tópicos relacionados.

Com isso dito, o SQL Server Profiler (deve estar localizado em Microsoft SQL Server 2008 -> Performance Tools se você o instalou como parte da instalação das ferramentas do cliente) expõe três eventos diretamente relacionados à compilação de consultas que podem ser úteis para você:
  • Cursor
    • CursorRecompilar
  • Desempenho
    • Showplan XML para compilação de consulta
  • Procedimento armazenado
    • SP:Recompilar

Você está usando procedimentos armazenados, então provavelmente você só precisa se preocupar com o SP:Recompilar evento. Este evento será acionado sempre que um procedimento armazenado, gatilho ou função definida pelo usuário for recompilado. A coluna TextData mostrará o texto da instrução tsql que causou a recompilação da instrução e a coluna EventSubClass mostrará um código que indica o motivo da recompilação.

Códigos EventSubClass para SP:Recompilar no SQL 2008
  • 1 =Esquema alterado
  • 2 =Estatísticas alteradas
  • 3 =Recompilar DNR
  • 4 =Definir opção alterada
  • 5 =Tabela temporária alterada
  • 6 =Conjunto de linhas remoto alterado
  • 7 =Para permissões de navegação alteradas
  • 8 =Ambiente de notificação de consulta alterado
  • 9 =Visualização MPI alterada
  • 10 =Opções do cursor alteradas
  • 11 =Com opção de recompilação

Se você monitorar os 5 eventos a seguir, poderá ver quais procedimentos armazenados e instruções estão sendo invocados no SQL Server e quais estão acionando recompilações:
  • Procedimentos da Loja
    • SP:Iniciando
    • SP:StmtStarting
    • SP:Recompilar
    • SP:Concluído
  • Desempenho
    • Estatísticas automáticas

Eu também costumo configurar o rastreamento do Profiler para capturar todas as colunas para esses eventos. Eu diria que configure um rastreamento com esses 5 eventos, execute um rastreamento por 30 a 60 segundos e, em seguida, pause-o e, em seguida, você deve ter um bom instantâneo do que está causando as recompilações.

Se houver muito ruído, você pode começar a adicionar filtros de coluna às propriedades de rastreamento para filtrar eventos de entrada/saída. Por exemplo, se você encontrar a maioria de suas recompilações acontecendo apenas em um banco de dados, configure um filtro de coluna na coluna databaseID ou databaseName para que apenas as consultas executadas nesse banco de dados sejam incluídas em seu rastreamento.

Em seguida, comece a procurar padrões nos quais as consultas estão sendo recompiladas e use o whitepaper da Microsoft como um guia para explicar por que elas podem estar acionando a recompilação.