sql-server - 准确测量存储过程的性能

标签 sql-server performance stored-procedures

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

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

到目前为止我的想法:

  • 查看查询执行时间 SQL Management Studio:不是很准确,但很方便。
  • 在存储过程中添加计时器并打印耗时:添加这样的调试代码很糟糕。
  • 使用 SQL Server Profiler,添加过滤器以仅针对我的存储过程。这是迄今为止我最好的选择。

还有其他选择吗?

最佳答案

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 的哪些部分性能不佳的指示,以及 - 如果您包括执行计划 - 原因。

关于sql-server - 准确测量存储过程的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757083/

相关文章:

python - For 循环与 while 和 next 性能

MySQL 条件 JOIN 使用 CASE Stmt

sql - LIKE SQL 中的解决方法(性能问题)

sql-server - 预期 ID 错误 - SQL Server

Android Studio 非常缓慢和滞后

Javascript 和非常长的字符串

stored-procedures - Crystal Reports 无法识别已将新参数添加到报告存储过程中

mysql - 如何查看阻止我创建存储过程的错误?

sql - 获取列中值计数最大的每个用户的行

sql - 从表中选择日期分为两列