我正在试图找出为什么SQL Server存储过程执行缓慢,所以我加入了一些粗略的计时器,如下所示:
Create Procedure DoStuff
As Begin
Declare @Stopwatch datetime
Set @Stopwatch=GetDate()
Print char(13) + 'Task A'
/* Perform Task A */
Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate()
Print char(13) + 'Task B'
/* Perform Task B */
Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate()
Print char(13) + 'Task C'
-- Perform Task C
Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate()
End
Exec DoStuff
我得到的是这样的东西:
Task A 0 Task B 80 Task C 100
所以我认为该过程需要180毫秒才能执行。但是,该过程需要3000多毫秒才能执行;在客户统计中,我得到了
Client processing time: 12 Total execution time: 3105 Wait time on server replies: 3093
额外约2800毫秒的原因是什么?
答案 0 :(得分:5)
检查个别时间是一种粗略的方法。更好的方法是在SQL事件探查器中运行跟踪并监视SP:Completed和SP:StmtCompleted事件。
SP:当完成时,记录完成,给出总时间 SP:当sproc中的每个语句完成时,将记录StmtCompleted。因此,这将为您提供每个部分的时间。
值得使用这种方法,重新检查数字,然后从那里开始。
答案 1 :(得分:2)
我敢打赌,你的程序每次运行时都会重新编译,这需要时间。请阅读:http://www.sql-server-performance.com/articles/per/optimizing_sp_recompiles_p1.aspx
使@Stopwatch成为输入参数并传入GETDATE(),然后将其作为OUTPUT参数传回。然后,您可以打印另外两个时间间隔,从EXECUTE到实际运行的时间,以及从RETURN到呼叫者再次控制的时间。
答案 2 :(得分:1)
如果打开它,也可以尝试关闭“显示执行计划”选项。这实际上会丢失总执行时间的数字 - 这通常会导致总执行时间产生非常误导性的结果。
答案 3 :(得分:0)
它可能是桌面上的一块,或者由于某种原因等待资源。
您可以查看管理实用程序,看看是否有锁或等待,这取决于它显示的内容。
或者,它也可以是用于回复到SP的入站和出站通信的网络通信。
答案 4 :(得分:0)
如果您在SSMS中执行它的事务性是一个不知情的猜测。但是你应该看看执行计划,以了解更多有关真正原因的信息。这可能是一些事情。