Як я можу контролювати кількість викликів за збережену процедуру за часовий проміжок часу?


10

Для того, щоб діагностувати деякі проблеми продуктивності, я хотів би краще зрозуміти, скільки разів викликаються певні процедури порівняно з продуктивністю системи. Чи існує спосіб отримати кількість викликів кожної процедури протягом певного періоду часу?

Відповіді:


17

Ви можете отримати це (і багато іншого) з динамічних представлень управління (DMV). Щоб отримати статистику для певної збереженої процедури, спробуйте наступний запит.

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

Щоб переглянути найчастіше виконуючі процедури:

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

Зведені значення є сукупними з моменту останнього перезапуску. Якщо ви хочете виміряти протягом певного періоду, скористайтеся командою нижче, щоб скинути статистику очікування.

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

Якщо ви хочете виміряти фіксований часовий діапазон протягом дня, ви можете подати висновок запиту в таблицю за допомогою завдання агента, або: a) обчислити значення між двома запусками або b) видати статистику очікування скидання як останній крок у роботі агента .

Крім того, зафіксуйте слід профілера та запустіть його через Clear Trace .


Здається, я отримую багато-багато результатів, але не зовсім. Наприклад, я бачу під стовпцем у відповіді object_name кілька одних і тих же об'єктів, але більшість деталей однакові за кількома винятками. Деталі стовпців, які відповідають: ExecutionCount, Call / Second, AgeInCache. Деталі стовпців, які не відповідають: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. Що б спричинило результат багатьох до багатьох?
kstubs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.