2011-01-28 100 views

回答

9

这是Glenn Berry的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%可能的。]

+0

哇,谢谢,这正是我所需要的。虽然这很有趣,但是我可以知道哪些是我们可以删除的,因为它们不会被使用。谢谢。 – adudley 2011-01-28 10:35:00

相关问题