【问题标题】:SQL Stored Procedure execution time mysterySQL存储过程执行时间之谜
【发布时间】:2011-01-13 16:39:50
【问题描述】:

我试图弄清楚为什么 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

我得到了这样的东西:

任务 A 0 任务 B 80 任务 C 100

所以我认为该过程需要 180 毫秒才能执行。但是,该过程需要 3000+ 毫秒才能执行;在客户统计中,我得到

客户处理时间:12 总执行时间:3105 服务器回复的等待时间:3093

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

【问题讨论】:

    标签: sql sql-server optimization query-optimization


    【解决方案1】:

    这是检查各个时间的粗略方法。更好的方法是在 SQL Profiler 中运行跟踪并监视 SP:CompletedSP:StmtCompleted 事件。

    SP:Completed 在 sproc 完成时记录,给出总时间。
    SP:StmtCompleted 在存储过程中的每个语句完成时记录。因此,这将为您提供存储过程中每个单独部分的时间。

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

    【讨论】:

      【解决方案2】:

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

      将@Stopwatch 设为输入参数并传入GETDATE(),然后将其作为OUTPUT 参数传回。然后您可以打印另外两个时间间隔,即从 EXECUTE 到实际运行的时间,以及从 RETURN 到调用者再次获得控制权的时间。

      【讨论】:

        【解决方案3】:

        如果您打开“显示执行计划”选项,请尝试关闭它。这确实会影响您的总执行时间——它通常会导致总执行时间的结果非常误导。

        【讨论】:

          【解决方案4】:

          它可能是桌子上的一块,或者由于某种原因等待资源。

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

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

          【讨论】:

            【解决方案5】:

            如果您在 SSMS 中执行事务性,则这是一个不知情的猜测。但是您应该查看执行计划以了解更多关于真正原因的信息。这可能是很多事情。

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

            【讨论】:

              猜你喜欢
              • 2014-10-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-27
              相关资源
              最近更新 更多