SQL存储过程执行时间之谜

时间:2010-02-05 20:41:30

标签: sql sql-server optimization query-optimization

我正在试图找出为什么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毫秒的原因是什么?

5 个答案:

答案 0 :(得分:5)

检查个别时间是一种粗略的方法。更好的方法是在SQL事件探查器中运行跟踪并监视SP:CompletedSP: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中执行它的事务性是一个不知情的猜测。但是你应该看看执行计划,以了解更多有关真正原因的信息。这可能是一些事情。

http://msdn.microsoft.com/en-us/library/ms178071.aspx