2010-02-05 27 views
3

我试图找出为什么一个SQL Server存储过程执行慢,所以我把一些原油定时器,像这样:SQL存储过程的执行时间之谜

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+ ms才能执行;在客户端统计,我得到

 
Client processing time: 12 
Total execution time: 3105 
Wait time on server replies: 3093 

的额外〜2800毫秒的原因是什么?

回答

5

这是检查各次粗暴的方式。更好的方法是在SQL事件探查器中运行跟踪并监视事件SP:CompletedSP:StmtCompleted

SP:当sproc完成时记录完成,给出整体时间。
SP:当sproc中的每个语句完成时记录StmtCompleted。所以这会给你的时间为每个单独的部分的sproc。

这将是值得使用这种方法,重新检查数字,然后从那里去。

0

它可能是表格上的一个块,或者出于某种原因等待资源。

您可以查看管理实用程序并查看是否存在锁定或正在进行的等待,这取决于它显示的内容。

或者,它也可以是用于回复SP入站和出站通信的网络通信。

1

另请尝试关闭“显示执行计划”选项(如果打开它)。这确实会导致您的总执行时间数字 - 通常会导致总执行时间的误导性结果。