Estou corrigindo problemas de desempenho em um procedimento armazenado com várias instruções no SQL Server. Quero saber em quais partes devo gastar tempo.
Entendo em Como leio o Custo de consulta e é sempre uma porcentagem? que mesmo quando o SSMS é instruído a incluir o plano de execução real , os números "Custo da consulta (relativo ao lote)" ainda são baseados em estimativas de custo , que podem estar longe dos valores reais
Entendo, Medindo o desempenho da consulta: "Custo da consulta do plano de execução" vs "Tempo decorrido", que posso cercar a invocação do procedimento armazenado com SET STATISTICS TIME
instruções e, em seguida, receberei uma lista como esta no Messages
painel:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
[etc]
SQL Server Execution Times:
CPU time = 187 ms, elapsed time = 206 ms.
com uma mensagem de saída para cada instrução.
Posso 'facilmente' (embora não seja conveniente) associar a saída de estatísticas de tempo aos planos de execução de declaração por instrução no painel Plano de execução, contando-os: A quarta SQL Server Execution Times
saída de mensagem corresponde a Query 4
no painel Plano de execução e assim por diante.
Mas existe uma maneira melhor?
Duration
eCPU
resultados são reais e não estimativas, sim?Uma boa maneira de fazer isso é com o Profiler. Configure uma "reprodução" do seu proc do problema em uma caixa de desenvolvimento ou teste, ou seja, uma chamada de amostra para o proc com parâmetros. Em seguida, usando o Profiler, crie um rastreamento usando o modelo TSQL_SPs ou, a partir de um modelo em branco, adicione o evento SP: StmtCompleted. Adicione as colunas Duração, Leitura, Gravação e CPU, se ainda não estiverem disponíveis. Adicione um filtro ao rastreamento no seu SPID (que você deve conhecer no Management Studio). Você também pode adicionar um filtro à Duração (por exemplo, maior que 1000 = maior que 1 segundo).
Você pode executar o rastreamento no Profiler, embora haja sobrecarga (NÃO faça isso em uma caixa de produção) ou exportar a definição e criar um rastreamento no lado do servidor. A sobrecarga do Profiler não é muito importante em um desenvolvedor ou caixa de teste dedicada.
Execute o proc e deixe-o concluir. Você também pode coletar o plano de Execução Real neste momento.
Interrompa seu rastreio e abra o arquivo, e você verá uma linha por linha do seu proc, incluindo horários para cada etapa. Acho isso mais útil do que o plano para identificar gargalos, embora o plano seja útil ao examinar as seções relevantes a serem ajustadas.
HTH
fonte
Você também pode usar os sys.dm_exec_procedure_stats e sys.dm_exec_query_stats exibições de gerenciamento dinâmico. O primeiro deles fornece informações sobre o procedimento como um todo; o segundo pode ser usado para interromper cada consulta no procedimento. Um exemplo é mostrado abaixo:
Estatísticas do procedimento:
Consultas dentro do procedimento:
fonte