Come posso monitorare il conteggio delle chiamate per procedura memorizzata per periodo?


10

Al fine di diagnosticare alcuni problemi di prestazioni, vorrei ottenere una migliore comprensione del numero di volte in cui vengono chiamate determinate procedure rispetto alle prestazioni del sistema. C'è un modo per ottenere il numero di volte in cui ogni procedura è stata chiamata durante un determinato periodo di tempo?

Risposte:


17

Puoi ottenere questo (e altro) dalle visualizzazioni di gestione dinamica (DMV). Per ottenere statistiche per una particolare procedura memorizzata, provare la seguente query.

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);

Per esaminare le procedure eseguite più frequentemente:

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);

I valori riportati sono cumulativi dall'ultimo riavvio. Se si desidera misurare su un periodo fisso, utilizzare il comando seguente per ripristinare le statistiche di attesa.

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

Se si desidera misurare intervalli temporali fissi nell'arco della giornata, è possibile alimentare l'output della query in una tabella tramite un processo agente e a) calcolare i valori tra due esecuzioni oppure b) emettere le statistiche di attesa reimpostate come ultimo passaggio nel processo agente .

In alternativa, acquisire una traccia del profiler ed eseguirla attraverso Clear Trace .


Sembra che sto ottenendo un numero di risultati molti o molti ma non esattamente. Ad esempio, vedo sotto la colonna risposta nome_oggetto molti degli stessi oggetti, ma la maggior parte dei dettagli sono gli stessi con alcune eccezioni. Dettagli delle colonne corrispondenti: ExecutionCount, Call / Second, AgeInCache. Dettagli della colonna che non corrispondono: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. Cosa causerebbe il risultato da molti a molti?
kstubs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.