如何在SQL Server中查找存储过程的执行时间?

30
我有10个存储过程,分别是SP1、SP2......SP10,这些存储过程会执行一些操作。我需要按照以下方式运行这些存储过程: EXECUTE SP1; EXECUTE SP2; ... EXECUTE SP10;
当SQL服务器完成执行这些存储过程时,它会给出十行显示由所有这些存储过程引起的任何行更改。我想要做的是,在执行所有存储过程后,SQL Server还能在输出窗口中给出每个存储过程的执行时间。 我能做到吗?我确信为了实现这个任务,我需要修改存储过程,但我不知道该如何做... 请帮帮我,谢谢。
6个回答

33

假设使用管理工具或其他带有输出窗格的环境,您可以:

SET STATISTICS TIME ON
EXEC SP1
EXEC SP2
...
SET STATISTICS TIME OFF

18
您可以使用 Sql Server Profiler 来实现此目的,它提供了每个执行的查询和存储过程的许多有用信息。 MSDN: SQL Profiler Data Columns SQL Profiler显示每个事件的执行时间。
另一个简单的方法:
  1. 声明2个datetime变量:start/end
  2. 将start设置为GETDATE()
  3. EXEC SP_NAME
  4. 将end设置为GETDATE()
  5. 执行时间 - end与start之间的差异

1
数据列描述链接现在指向“SQL Server 2000已退役技术文档”。第一个链接(到Sql Server Profiler)仍然有效。我没有编辑答案的权限。 - J. Chris Compton
感谢您的回答。我使用以下语句找到了两个日期之间的差异:datediff(millisecond, @start, @end) - Scott

9
declare @start datetime = getdate()

-- your SQL statements
exec dbo.MyStoredProcedure

declare @executionTimeInMilliseconds int = datediff(ms, @start, getdate())

8

您不需要修改存储过程代码。以下查询将提供一些关于存储过程执行时间的统计信息。

SELECT 
   DB_NAME(database_id) [database],
   OBJECT_NAME(object_id) [stored_procedure],
   cached_time, 
   last_execution_time, 
   execution_count,
   total_elapsed_time/execution_count [avg_elapsed_time],
   [type_desc]
FROM sys.dm_exec_procedure_stats
--WHERE OBJECT_NAME(object_id) IN ('SP1','SP2','SP3','SP4','SP5')
ORDER BY avg_elapsed_time desc;

试一试吧。


2
我喜欢这个答案,因为我可以在事后看到值。我们每晚都有数据编译,我正在分析所有时间花费的地方...而这些作业需要数小时。SET STATS TIME建议要求我坐等,而且它们不输出任何子sp调用的名称。 - ripvlan
2
PS - 我添加了cross apply sys.dm_exec_query_plan (s.plan_handle),现在可以获取查询计划。另外请注意,经过的时间包括在调用子存储过程中花费的时间。例如,如果主程序调用child1和child2,并且child1花费30,child2花费60,那么主程序将至少需要90。 - ripvlan

5

有一些使用工具(如Sql Server分析器)来完成此操作的方法,但一种简单的方法是在每个存储过程周围运行一条打印时间的语句:

print convert(varchar, getdate(), 21)
EXEC PROC SP1
print convert(varchar, getdate(), 21)

为什么要转换为varchar?基本上你应该做的是获取运行存储过程前后的毫秒差异。 - t-clausen.dk
只有将它格式化输出,例如 2011-10-14 12:32:39.403,才能简单地获得这样的结果。如果仅保留日期时间不一定会提供毫秒数,并且仅报告差异会失去额外的数据记录——运行时间,以防止其无人值守。 - Widor

1

捕获并显示执行时间

使用datetime类型的两个参数,在存储过程中在tsql开始之前使用getdate()设置一个参数。

tsql之后使用getdate()设置第二个参数,最后使用datediff函数获取差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接