我有一个很长的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毫秒?
谢谢!
答案 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;