SQL存储过程执行时间之谜

标签 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 毫秒是什么原因?

最佳答案

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

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

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

关于SQL存储过程执行时间之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210271/

相关文章:

c# - QueryOver 上的 GroupBy SqlFunction

sql - 平均股票历史表

mysql - 第二个插入在我的触发器中不起作用

MySQL根据条件排序

sql-server - GETDATE 和 SYSDATETIME 的区别

sql - 显示水平列出的状态之间的天数

sql - 单个字段是否包含来自不同表的多个外键关系[SQL]

c++ - 具有相对间隙的 CPLEX MIP 提前终止,getBestObjValue 与 getObjValue

optimization - 有哪些工具可以对Hadoop例程的Cascading进行基准测试?

java - 与平面 if 语句相比,嵌套 if 语句是否可以提高性能或具有其他优势?