¿Cómo puedo monitorear el conteo de llamadas por procedimiento almacenado por intervalo de tiempo?


10

Para diagnosticar algunos problemas de rendimiento, me gustaría comprender mejor la cantidad de veces que se llaman ciertos procedimientos en comparación con el rendimiento del sistema. ¿Hay alguna manera de obtener la cantidad de veces que se llamó a cada procedimiento durante un período de tiempo determinado?

Respuestas:


17

Puede obtener esto (y más) de las Vistas de administración dinámica (DMV). Para obtener estadísticas de un procedimiento almacenado en particular, intente la siguiente 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 ver los procedimientos ejecutados con mayor frecuencia:

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

Los valores informados son acumulativos desde el último reinicio. Si desea medir durante un período fijo, utilice el siguiente comando para restablecer las estadísticas de espera.

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

Si desea medir períodos de tiempo fijos a lo largo del día, puede alimentar el resultado de la consulta a una tabla a través de un trabajo de agente y a) calcular los valores entre dos ejecuciones ob) emitir el restablecimiento de las estadísticas de espera como el último paso en el trabajo del agente .

Alternativamente, capture una traza del generador de perfiles y ejecútela a través de Clear Trace .


Parece que estoy obteniendo un conjunto de resultados de muchos a muchos, pero no exactamente. Por ejemplo, veo en la columna respuesta object_name varios de los mismos objetos, pero la mayoría de los detalles son los mismos con algunas excepciones. Detalles de columnas que coinciden: ExecutionCount, Call / Second, AgeInCache. Detalles de columna que no coinciden: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. ¿Qué causaría el resultado de muchos a muchos?
kstubs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.