【发布时间】:2010-12-28 21:38:30
【问题描述】:
我们在应用程序中创建了如此多低效的存储过程,我们总是推迟以提高效率,直到数据库性能出现严重问题。
现在,我正在考虑通过最常执行的存储过程来一一修复它。
确定执行次数最多的存储过程的最佳方法是什么?
是否有脚本可以显示执行次数最多的存储过程?
【问题讨论】:
标签: sql sql-server database tsql stored-procedures
我们在应用程序中创建了如此多低效的存储过程,我们总是推迟以提高效率,直到数据库性能出现严重问题。
现在,我正在考虑通过最常执行的存储过程来一一修复它。
确定执行次数最多的存储过程的最佳方法是什么?
是否有脚本可以显示执行次数最多的存储过程?
【问题讨论】:
标签: sql sql-server database tsql stored-procedures
另一个出色的工具是 Microsoft 的 Performance Dashboard。
【讨论】:
用途:
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
【讨论】:
SUBSTRING(Text, statement_start_offset/2, case when (statement_end_offset = -1) then len(Text) else (statement_end_offset-statement_start_offset)/2 end) 用于SP 内部的实际查询
实现此目的的一种快速方法是运行 SQL Profiler,然后按 TextData 将跟踪“分组”。
您可能还只想观看特定事件,例如 SQL Batch Completed。如果我记得的话,这会给你持续时间和其他方便的统计数据来分组/过滤。
【讨论】:
典型情况..
运行性能分析器 然后启动您的应用程序 设置一些过滤器来捕获大量的读取/写入/扫描等。
【讨论】: