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

Aze*_*eem 23 sql sql-server

我有10个存储过程如下:SP1,SP2,.....,SP10这些存储过程做了一些事情.我需要按如下方式运行这些过程:EXECUTE SP1; 执行SP2; ... EXECUTE SP10;

当SQL服务器完成这些过程的执行时,它会显示十行,显示由所有这些存储过程引起的任何行更改. 我想要做的是,在执行所有存储过程之后,SQL Server还在输出窗口中为每个存储过程提供执行时间. 我能这样做吗?我确信为了完成这个任务我需要修改存储过程,但我不知道该怎么做...请帮助我.谢谢.

Ale*_* K. 27

假设管理工作室或其他具有输出窗格的环境,您可以;

SET STATISTICS TIME ON
EXEC SP1
EXEC SP2
...
SET STATISTICS TIME OFF
Run Code Online (Sandbox Code Playgroud)


sll*_*sll 14

您可以使用Sql Server Profiler来实现此目的,它还在每个执行的查询和存储过程中提供了许多有用的信息.

MSDN:SQL事件探查器数据列

SQL事件探查器显示每个事件的执行时间

另一种直截了当的方式:

  1. DECLARE 2个日期时间变量:开始/结束
  2. SET start = GETDATE()
  3. EXEC SP_NAME
  4. SET end = GETDATE()
  5. 执行时间 - 结束和开始之间的差异


小智 8

您根本不需要修改 SP 代码。以下查询为您提供了有关 SP 执行时间的一些统计信息。

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;
Run Code Online (Sandbox Code Playgroud)

去尝试一下。

  • 我喜欢这个答案,因为我可以在事后看到价值观。我们每晚都会进行数据编译,我正在分析所有时间都花在哪里了……这些都是长达数小时的工作。SET STATS TIME 建议要求我坐下来等待,而且它们不会输出任何子 sp 调用的名称。 (2认同)
  • PS - 我添加了交叉应用 sys.dm_exec_query_plan (s.plan_handle),现在可以获取查询计划。另请注意,经过的时间包括呼叫儿童 sps 所花费的时间。例如,main 调用 child1 和 child2,child1 取 30,child2 取 60,main 将(至少)为 90。 (2认同)

Ill*_*ych 7

declare @start datetime = getdate()

-- your SQL statements
exec dbo.MyStoredProcedure

declare @executionTimeInMilliseconds int = datediff(ms, @start, getdate())
Run Code Online (Sandbox Code Playgroud)


Wid*_*dor 5

有一些方法可以使用 Sql Server profiler 等工具来做到这一点,但一个简单的方法是运行每个 proc 用一行包围来打印时间:

print convert(varchar, getdate(), 21)
EXEC PROC SP1
print convert(varchar, getdate(), 21)
Run Code Online (Sandbox Code Playgroud)