Como posso monitorar a contagem de chamadas por procedimento armazenado por período de tempo?

10

Para diagnosticar alguns problemas de desempenho, eu gostaria de entender melhor o número de vezes que certos procedimentos são chamados em comparação com o desempenho do sistema. Existe uma maneira de obter o número de vezes que cada procedimento foi chamado durante um certo período de tempo?

olle
fonte

Respostas:

17

Você pode obter isso (e muito mais) em Dynamic Management Views (DMVs). Para obter estatísticas para um procedimento armazenado específico, tente a seguinte consulta.

SELECT
    OBJECT_NAME(qt.objectid)
  , qs.execution_count AS [Execution Count]
  , qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
  , qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
  , qs.total_worker_time AS [TotalWorkerTime]
  , qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
  , qs.max_logical_reads
  , qs.max_logical_writes
  , qs.total_physical_reads
  , DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    qt.[dbid] = DB_ID()
AND qt.objectid = OBJECT_ID('StoredProcedureName')
OPTION (RECOMPILE);

Para examinar os procedimentos mais frequentemente executados:

SELECT
    OBJECT_NAME(qt.objectid)
  , qs.execution_count AS [Execution Count]
  , qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
  , qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
  , qs.total_worker_time AS [TotalWorkerTime]
  , qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
  , qs.max_logical_reads
  , qs.max_logical_writes
  , qs.total_physical_reads
  , DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    qt.[dbid] = DB_ID()
ORDER BY
    qs.execution_count DESC
OPTION (RECOMPILE);

Os valores relatados são cumulativos desde a última reinicialização. Se você deseja medir por um período fixo, use o comando abaixo para redefinir as estatísticas de espera.

DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR);

Se você deseja medir intervalos de tempo fixos ao longo do dia, você pode alimentar a saída da consulta para uma tabela por meio de um trabalho do agente e a) calcular os valores entre duas execuções ou b) emitir as estatísticas de espera redefinidas como a última etapa do trabalho do agente .

Como alternativa, capture um rastreamento do criador de perfil e execute-o no Clear Trace .

Mark Storey-Smith
fonte
Parece que estou obtendo um conjunto de resultados muitos a muitos, mas não exatamente. Por exemplo, na coluna resposta do objeto nome_objeto vários dos mesmos objetos, mas a maioria dos detalhes é a mesma, com algumas exceções. Detalhes das colunas correspondentes: ExecutionCount, Call / Second, AgeInCache. Detalhes da coluna que não correspondem: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. O que causaria muitos a muitos resultados?
Ktubs #