准确测量存储过程的性能

时间:2011-01-21 09:12:46

标签: sql-server performance stored-procedures

准确衡量存储过程的性能(完成时间)的最佳方法是什么?

我即将开始尝试优化怪物存储过程,为了正确判断我的调整是否有任何影响,我需要一些东西来比较之前和之后。

到目前为止我的想法:

  • 查看查询执行时间SQL Management Studio:不太准确,但非常方便。
  • 在存储过程中添加计时器并打印已用时间:添加类似stink的调试代码。
  • 使用SQL Server Profiler,添加过滤器以仅定位我的存储过程。到目前为止,这是我最好的选择。

还有其他选择吗?

4 个答案:

答案 0 :(得分:8)

DMV dm_exec_query_stats

中有许多详细的性能信息
DECLARE @procname VARCHAR(255)
SET @procname = 'your proc name'

SELECT * FROM sys.dm_exec_query_stats WHERE st.objectid = OBJECT_ID(@procname)

这将为您提供每个缓存语句的累积性能数据和执行计数。

您可以使用DBCC FREEPROCCACHE重置计数器(不要在生产系统中运行它,因为它将清除所有缓存的查询计划)。

您可以通过扩展此查询来获取每个语句的查询计划:

SELECT  SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
        ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) [sub_statement]
        ,*, CONVERT(XML, tqp.query_plan)
FROM sys.dm_exec_query_stats qs CROSS APPLY
     sys.dm_exec_sql_text(sql_handle) st CROSS APPLY
     sys.dm_exec_query_plan(plan_handle) qp CROSS APPLY
     sys.dm_exec_text_query_plan(plan_handle, statement_start_offset, statement_end_offset  ) tqp
WHERE st.objectid = OBJECT_ID(@procname)
ORDER BY statement_start_offset, execution_count

这将为您提供有关SP的哪些部分表现不佳的指示,以及 - 如果您包含执行计划 - 为什么。

答案 1 :(得分:6)

Profiler是最可靠的方法。您也可以使用SET STATISTICS IO ONSET STATISTICS TIME ON,但这些不包括标量UDF的全部影响。

您还可以在SSMS中打开“包含客户端统计信息”选项,以全面了解最近10次运行的效果。

答案 2 :(得分:1)

定时器/调试选项的一个可能改进是将结果存储在表中。通过这种方式,您可以使用SQL查询对生成的时序数据进行切片和切块,而不仅仅是直观地解析调试输出。

答案 3 :(得分:1)

您希望确保您正在进行公平的测试,即比较喜欢。考虑使用冷缓存运行测试,以便每次执行测试时强制从IO子系统提供存储过程执行。

查看系统存储过程DBCC FREEPROCCACHEDBCC FREESYSTEMCACHE