【问题标题】:How to identify the slowest queries in stored procedure or batch using SET STATISTICS TIME?如何使用 SET STATISTICS TIME 识别存储过程或批处理中最慢的查询?
【发布时间】:2014-10-09 09:34:51
【问题描述】:

我有一个很长的 SQL 脚本,包括 1500 行代码,有人认为它很慢,希望我能在其中找到慢查询并调整它们。

我使用SET STATISTICS TIME ON打印出脚本中每个步骤的实际经过时间,发现其中一些退出速度很慢,例如:

/***********************************************/  
   CPU time = 0 ms,  elapsed time = 1 ms.

(0 row(s) affected)

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1 ms.

(4 row(s) affected)

(1 row(s) affected)

 SQL Server Execution Times:  
   CPU time = 15 ms,  elapsed time = 10548 ms.  
SQL Server parse and compile time:   
   CPU time = 0 ms, elapsed time = 2 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1 ms.

/***********************************************/   

但问题是我无法确定哪个查询花费了这么长时间,因为脚本太长了。我怎么知道这个长脚本中的哪个查询花费了 10548 毫秒?

谢谢!

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

我通过使用分析器得到了答案:Using SP:STMTCompleted trace event and use filter to only trace your connection。存储过程中的每个 TSQL 都将被打印出来,包括持续时间。当 SP 运行完成后,将跟踪结果复制到 Excel 并按持续时间对其进行排序,然后您将获得最慢的 TSQL。但注意 SP:STMTCompleted 仅适用于存储过程。我不知道如何批量处理。

【讨论】:

    【解决方案2】:

    列出执行最慢的第一个查询和运行最慢的查询的数据。

    SELECT  creation_time 
                ,last_execution_time
                ,total_physical_reads
                ,total_logical_reads 
                ,total_logical_writes
                , execution_count
                , total_worker_time
                , total_elapsed_time
                , total_elapsed_time / execution_count avg_elapsed_time
                ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
                 ((CASE statement_end_offset
                  WHEN -1 THEN DATALENGTH(st.text)
                  ELSE qs.statement_end_offset END
                    - qs.statement_start_offset)/2) + 1) AS statement_text
        FROM sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
        ORDER BY total_elapsed_time / execution_count DESC;
    

    【讨论】:

    • 我知道这个查询,但这不是我想要的。我需要知道长存储过程中最慢的查询,而不是整个 SQL Server 中最慢的查询。我们在 SQL Server 上运行了很多慢查询,但这次我只想关注一个存储过程。
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多