Это один из запросов 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% идентифицировать хранимые процедуры, которые не вызываются с их использованием.]