Jak mogę monitorować liczbę połączeń według procedury składowanej według przedziału czasu?

10

W celu zdiagnozowania niektórych problemów z wydajnością chciałbym lepiej zrozumieć, ile razy niektóre procedury są wywoływane w porównaniu do wydajności systemu. Czy istnieje sposób na uzyskanie liczby wywołań każdej procedury w określonym przedziale czasowym?

olle
źródło

Odpowiedzi:

17

Możesz uzyskać to (i więcej) z Widoku zarządzania dynamicznego (DMV). Aby uzyskać statystyki dla określonej procedury składowanej, spróbuj wykonać następujące zapytanie.

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

Aby zobaczyć najczęściej wykonywane procedury:

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

Podane wartości kumulują się od ostatniego restartu. Jeśli chcesz mierzyć przez określony czas, użyj poniższego polecenia, aby zresetować statystyki oczekiwania.

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

Jeśli chcesz mierzyć stałe przedziały czasowe w ciągu dnia, możesz podać wyniki zapytania do tabeli za pośrednictwem zadania agenta i albo a) obliczyć wartości między dwoma uruchomieniami lub b) wydać resetowanie statystyk oczekiwania jako ostatni krok w zadaniu agenta .

Możesz też przechwycić ślad profilera i uruchomić go przez Wyczyść ślad .

Mark Storey-Smith
źródło
Wygląda na to, że otrzymuję zestaw wyników od wielu do wielu, ale nie do końca. Na przykład widzę pod kolumną odpowiedź nazwa_obiektu kilka takich samych obiektów, ale większość szczegółów jest taka sama z kilkoma wyjątkami. Szczegóły pasujących kolumn: ExecutionCount, Call / Second, AgeInCache. Szczegóły kolumny, które nie pasują: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. Co spowodowałoby powstanie wielu do wielu?
kstubs