Как я могу контролировать количество вызовов для хранимой процедуры за промежуток времени?

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

Если вы хотите измерить фиксированные временные интервалы в течение дня, вы можете передать выходные данные запроса в таблицу с помощью задания агента и либо а) вычислить значения между двумя запусками, либо б) выполнить сброс статистики ожидания в качестве последнего шага в задании агента ,

Также можно захватить трассировку профилировщика и запустить ее через Clear Trace .

Марк Стори-Смит
источник
Кажется, я получаю множество результатов, но не совсем. Например, я вижу в столбце object_name response несколько одинаковых объектов, но большинство деталей совпадают с некоторыми исключениями. Соответствующие сведения столбцов: ExecutionCount, Call / Second, AgeInCache. Данные столбца, которые не совпадают: AvgWorkerTime, TotalWorkerTime, AvgElapesedTime. Что привело бы к результату многих ко многим?
kstubs