Afin de diagnostiquer des problèmes de performance, je voudrais mieux comprendre le nombre de fois que certaines procédures sont appelées par rapport à la performance 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?
Vous pouvez obtenir ceci (et plus) à partir de Vues de gestion dynamiques (DMVS). 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 regarder 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 signalées sont cumulatives depuis le dernier redémarrage. Si vous souhaitez mesurer sur une période déterminée, utilisez la commande ci-dessous pour réinitialiser les statistiques d'attente.
DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR);
Si vous vouliez mesurer les températures fixes au cours de la journée, vous pouvez alimenter la sortie de la requête à une table via un travail d'agent et a) Calculez les valeurs entre deux exécutions ou B) émettre la réinitialisation des statistiques d'attente comme la dernière étape du travail de l'agent. .
Alternativement, capturer une trace de profileur et exécuter-la à travers trace claire .