Как часто используется хранимая процедура xyz или табличная функция - SQL Server 2008 R2 - PullRequest
3 голосов
/ 28 января 2011

У нас есть несколько представлений, сохраненных процедур, табличных значений и скалярных функций.

Как мы можем видеть, как часто или даже сколько раз они вызывались из SQL Server?

Нужно ли редактировать каждую из них для обновления таблицы при каждом вызове, чтобы получить это, или SQL-сервер хранит эту информацию где-нибудь?

1 Ответ

9 голосов
/ 28 января 2011

Это один из запросов DMV Гленна Берри. Подсчитывает, сколько раз выполнялась кэшированная хранимая процедура (отфильтрованная по текущей базе данных):

SELECT TOP(25) p.name AS [SP Name], qs.execution_count,
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.total_worker_time AS [TotalWorkerTime],  
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.execution_count DESC OPTION (RECOMPILE);

Примечание: SQL Server хранит информацию только с момента последнего перезапуска службы и может также отбрасывать информацию под давлением памяти.

Также обратите внимание, что один только счетчик выполнения не показывает всю картину. Часто лучше определить самые дорогостоящие запросы и улучшить их. Я обычно начинаю с наивысшего логического чтения (это еще одно из слов Гленна):

SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], 
qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, 
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second], 
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count 
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE);

[Также обратите внимание: у вас могут быть процессы, которые периодически планируются (скажем, один раз в месяц). Таким образом, невозможно на 100% идентифицировать хранимые процедуры, которые не вызываются с их использованием.]

...