Comment puis-je surveiller le nombre d'appels par procédure stockée par intervalle de temps?


10

Afin de diagnostiquer certains problèmes de performances, j'aimerais mieux comprendre le nombre d'appels de certaines procédures par rapport aux performances du système. Existe-t-il un moyen d'obtenir le nombre de fois que chaque procédure a été appelée pendant une certaine période?

Réponses:


17

Vous pouvez l'obtenir (et plus) à partir des vues de gestion dynamique (DMV). Pour obtenir des statistiques pour une procédure stockée particulière, essayez la requête suivante.

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

Pour consulter les procédures les plus fréquemment exécutées:

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

Les valeurs rapportées sont cumulatives depuis le dernier redémarrage. Si vous souhaitez mesurer sur une période fixe, utilisez la commande ci-dessous pour réinitialiser les statistiques d'attente.

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

Si vous souhaitez mesurer des plages horaires fixes tout au long de la journée, vous pouvez alimenter la sortie de la requête vers une table via un travail d'agent et soit a) calculer les valeurs entre deux exécutions, soit b) émettre la réinitialisation des statistiques d'attente comme dernière étape du travail d'agent .

Vous pouvez également capturer une trace du profileur et l'exécuter via Clear Trace .


Il semble que j'obtienne un ensemble de résultats plusieurs à plusieurs, mais pas exactement. Par exemple, je vois sous la colonne réponse nom_objet plusieurs des mêmes objets mais la plupart des détails sont les mêmes à quelques exceptions près. Détails des colonnes qui correspondent: ExecutionCount, Call / Second, AgeInCache. Détails de colonne qui ne correspondent pas: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. Qu'est-ce qui causerait le résultat plusieurs à plusieurs?
kstubs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.