Slow running queries can drag down application performance and degrade user experience. As a DBA, it's important to monitor and optimize long running SQL statements.
In this post, I'll demonstrate how to find queries that have been executing for over 1 minute in SQL Server, using DMVs like sys.dm_exec_requests and sys.dm_exec_query_stats.
By querying these DMVs and joining to sys.dm_exec_sql_text, we can retrieve the full text of long running queries. Important details like total elapsed time, CPU time, reads and more are also returned.
The T-SQL code below filters for queries running longer than 1 minute and returns useful troubleshooting columns like the complete query plan. Reviewing this data helps identify the root cause like missing indexes, inefficient joins, repetitive scans etc.
/*https://www.dbascrolls.com*/ DECLARE @time_threshold INT = 60000; -- 1 minute in milliseconds SELECT r.session_id, DB_NAME(r.database_id) AS dbname, s.login_name, r.blocking_session_id, r.status, s.program_name, s.host_name, r.transaction_isolation_level, r.percent_complete, r.start_time, r.total_elapsed_time / 1000.0 AS total_elapsed_seconds, r.wait_type, r.last_wait_type, r.command, r.cpu_time, r.reads, r.writes, r.logical_reads, t.text AS query_text, qp.query_plan FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) qp WHERE r.total_elapsed_time > @time_threshold -- queries running longer than 1 minute ORDER BY r.total_elapsed_time DESC;