Wie identifiziere ich die langsamsten Abfragen in der gespeicherten Prozedur oder Batch mit SET STATISTICS TIME?

Ich habe eine sehr lange SQL-Skript mit 1500 Zeilen Code und jemand denke, es ist langsam und hoffe, ich kann langsam Abfragen in ihm finden und stimmen sie.

Ich benutze SET STATISTICS TIME ON , um die echte verstrichene time für jeden Schritt im Skript auszudrucken und einige von ihnen sind langsam zu beenden, wie zum Beispiel:

 /***********************************************/ 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. /***********************************************/ 

Aber das Problem ist, dass ich nicht herausfinden kann, welche Abfrage so lange time verbracht hat, weil das Skript zu lang ist. Wie kann ich wissen, welche Abfrage in diesem langen Skript 10548 ms verbracht hat?

Vielen Dank!

Ich habe die Antwort mit dem Profiler: Verwenden von SP: STMTCvollständige Trace-Veranstaltung und verwenden Sie Filter, um nur Ihre Verbindung zu verfolgen. Jede einzelne TSQL innerhalb gespeicherter Prozedur wird ausgedruckt einschließlich Dauer. Wenn das Laufen von SP durchgeführt wird, das Trace-Ergebnis in ein Excel kopieren und es nach Dauern sortieren, dann bekommst du die langsamste TSQL. Aber Hinweis SP: STMTCvollständig funktioniert nur für gespeicherte Prozedur. Ich habe keine Ahnung, wie es für Batch zu tun.

listet data mit den langsamsten ersten und langsamsten laufenden Abfragen auf.

 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;