如何使用SET STATISTICS TIME识别存储过程或批处理中最慢的查询?

时间:2014-10-09 09:34:52

标签: sql sql-server tsql

我有一个很长的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毫秒?

谢谢!

2 个答案:

答案 0 :(得分:1)

我通过使用分析器获得了答案:使用SP:STMTCompleted跟踪事件并使用过滤器仅跟踪您的连接。存储过程中的每个TSQL都将打印出来,包括持续时间。完成SP的运行后,将跟踪结果复制到Excel并按持续时间排序,然后获得最慢的TSQL。但注意SP:STMTCompleted仅适用于存储过程。我不知道怎么做批次。

答案 1 :(得分:0)

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

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;