代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

SQL存储过程执行时间之谜

  •  3
  • Herb Caudill  · 技术社区  · 15 年前

    我试图弄明白为什么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 回复  |  直到 15 年前
        1
  •  5
  •   AdaTheDev    15 年前

    这是一种粗略的检查个人时间的方法。更好的方法是在SQL事件探查器中运行跟踪并监视 SP:Completed SP:StmtCompleted 事件。

    sp:完成是在存储过程完成时记录的,给出总体时间。
    sp:stmtcompleted是在存储过程中的每个语句完成时记录的。因此,这将为存储过程的每个单独部分提供时间。

    使用这种方法是值得的,重新检查数据,然后从那里开始。

        2
  •  2
  •   KM.    15 年前

    我敢打赌,您的过程在每次运行时都在重新编译,这需要时间。请阅读: http://www.sql-server-performance.com/articles/per/optimizing_sp_recompiles_p1.aspx

    使@stopwatch成为一个输入参数并传入getDate(),然后将其作为一个输出参数返回。然后,您可以打印另外两个时间间隔,即从执行到实际运行的时间,以及从返回到调用方再次拥有控制权的时间。

        3
  •  1
  •   Dave Markle    15 年前

    如果打开“显示执行计划”选项,也可以尝试关闭它。这真的会使您的总执行时间数据相形见绌——这通常会导致对总执行时间产生非常误导的结果。

        4
  •  0
  •   Mitchel Sellers    15 年前

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

    您可以查看管理实用程序,看看是否有锁或等待正在进行,这是基于它所显示的内容。

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

        5
  •  0
  •   Keith Adler    15 年前

    如果你在SSMS中执行事务性,这是一个未经证实的猜测。但你应该看看执行计划,了解更多关于真正原因的信息。可能有很多事情。

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