2009-12-21 84 views
20

我们在应用程序中创建了如此多的低效率存储过程,我们总是推迟使其效率更高,直到我们遇到严重的数据库性能问题。最常执行的存储过程?

现在,我正在考虑通过最常执行的存储过程逐个修复它。

找出哪个存储过程执行得最多的最佳方法是什么?

是否有脚本可以显示哪个存储过程执行得最多?

回答

23

用途:

SELECT TOP 10 
     qt.TEXT AS 'SP Name', 
     SUBSTRING(qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN(qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, 
     qs.execution_count AS 'Execution Count', 
     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime', 
     qs.total_worker_time AS 'TotalWorkerTime', 
     qs.total_physical_reads AS 'PhysicalReads', 
     qs.creation_time 'CreationTime', 
     qs.execution_count/DATEDIFF(Second, qs.creation_time, GETDATE()) AS 'Calls/Second' 
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt 
WHERE qt.dbid = (SELECT dbid 
        FROM sys.sysdatabases 
        WHERE name = '[your database name]') 
ORDER BY qs.total_physical_reads DESC 

参考:SQL SERVER – 2005 – Find Highest/Most Used Stored Procedure

+0

还可以提取'SUBSTRING(文本,s​​tatement_start_offset/2,情况下,当(statement_end_offset = -1)然后LEN(文本) 否则(statement_end_offset-statement_start_offset)/ 2端)'用于SP内的实际查询 – 2009-12-21 22:55:39

+0

@Remus:补充,谢谢! – 2009-12-21 23:05:22

+0

它应该是SUBSTRING(qt.text,qs.statement_start_offset/2,CASE WHEN(qs.statement_end_offset = -1)THEN LEN(qt.text)ELSE(qs.statement_end_offset - qs.statement_start_offset)/ 2 END)AS actual_query, – 2009-12-22 05:27:53

0

典型情况..

运行性能分析器 然后启动你的应用程序 设置一些过滤器捕捉到大量的读/写/扫描等。

1

快速完成此操作的方法是运行SQL Profiler,然后通过TextData对您的跟踪进行“分组”。

  • 进入您的跟踪属性
  • 在事件选择选项卡,单击组织列 ...
  • 点击的TextData,并移动它到 “组”区域。

您可能还只想观看特定事件,如SQL批量完成。如果我记得,那会给你持续时间和其他方便的统计数据进行分组/过滤。

1

另一个奇妙的工具是Microsoft的Performance Dashboard。 link text