Skip to content

Current Activity DMVs

A collection of queries covering the current-activity DMVs: sessions, connections, requests, waiting tasks and blocked processes.

Published Nov 13, 2010

What is actually happening on the server right now? This collection covers sys.dm_exec_sessions, sys.dm_exec_connections, sys.dm_exec_requests and sys.dm_os_waiting_tasks, plus the two table-valued helpers sys.dm_exec_sql_text and sys.dm_exec_query_plan that turn handles into readable T-SQL and plans. It includes quick ways to pull the last statement for a session, the full request list with blocking info, a pair of scripts to create a deliberate block so you can test your own monitoring, and the classic "find the lead blocker" query built on sysprocesses.

/*
sys.dm_exec_sessions
sys.dm_exec_connections
sys.dm_exec_requests
sys.dm_os_waiting_tasks

sys.dm_exec_sql_text(sql_handle)
sys.dm_exec_query_plan(plan_handle)

*/



SELECT * FROM sys.dm_exec_sessions

SELECT * FROM sys.dm_exec_connections

SELECT * FROM sys.dm_exec_requests



-------------------------------
-- dm_exec_connections and dm_exec_sql_text
--
-- Get sql text query
-------------------------------
declare @sql varbinary(64) 
select @sql = most_recent_sql_handle from sys.dm_exec_connections where session_id = @@SPID
select * from sys.dm_exec_sql_text(@sql) 

select b.*, a.* from sys.dm_exec_connections a 
cross apply sys.dm_exec_sql_text(most_recent_sql_handle) b



-------------------------------
-- dm_exec_requests and dm_exec_query_plan
-- 
-- Get sql plan query
-------------------------------
select b.*, a.* from sys.dm_exec_requests a 
cross apply sys.dm_exec_query_plan(plan_handle) b



-------------------------------
-- dm_exec_requests
--
-- Current active processes using dm_exec_requests
-------------------------------
select a.blocking_session_id,a.last_wait_type,a.wait_resource,b.text,a.session_id,a.start_time,a.status,a.command,db_name(a.database_id) as database_name
,object_name(b.objectid,b.dbid) as object_name,a.user_id ,c.login_name 
,a.wait_time,a.cpu_time,a.total_elapsed_time,a.writes
,a.reads,a.logical_reads,a.granted_query_memory,a.nest_level,a.row_count,a.transaction_isolation_level
from sys.dm_exec_requests as a
cross apply sys.dm_exec_sql_text(sql_handle) as b inner join sys.dm_exec_sessions as c on a.session_id=c.session_id 
order by a.session_id



-------------------------------
-- dm_exec_sessions
--
-- Current active processes using dm_exec_sessions
-------------------------------
SELECT T.[text], P.[query_plan], S.[program_name], S.[host_name],
S.[client_interface_name], S.[login_name], R.*
FROM sys.dm_exec_requests R
INNER JOIN sys.dm_exec_sessions S 
ON S.session_id = R.session_id
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS T
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS P



-------------------------------
-- Create blocking for additional scripts
-------------------------------
-- run in query window 1
BEGIN TRAN
UPDATE Person.Contact SET Suffix = 'B' WHERE ContactID < 20
-- ROLLBACK or COMMIT

-- run in query window 2
SELECT * FROM Person.Contact WHERE ContactID < 20 



-------------------------------
-- dm_os_waiting_tasks 
--
-- get list of waiting tasks - http://blog.sqlauthority.com/2011/02/04/sql-server-dmv-sys-dm_os_waiting_tasks-and-sys-dm_exec_requests-wait-type-day-4-of-28/
-------------------------------
SELECT dm_ws.wait_duration_ms,
dm_ws.wait_type,
dm_es.status,
dm_t.TEXT,
dm_qp.query_plan,
dm_ws.session_ID,
dm_es.cpu_time,
dm_es.memory_usage,
dm_es.logical_reads,
dm_es.total_elapsed_time,
dm_es.program_name,
DB_NAME(dm_r.database_id) DatabaseName,
-- Optional columns
dm_ws.blocking_session_id,
dm_r.wait_resource,
dm_es.login_name,
dm_r.command,
dm_r.last_wait_type
FROM sys.dm_os_waiting_tasks dm_ws
INNER JOIN sys.dm_exec_requests dm_r ON dm_ws.session_id = dm_r.session_id
INNER JOIN sys.dm_exec_sessions dm_es ON dm_es.session_id = dm_r.session_id
CROSS APPLY sys.dm_exec_sql_text (dm_r.sql_handle) dm_t
CROSS APPLY sys.dm_exec_query_plan (dm_r.plan_handle) dm_qp
WHERE dm_es.is_user_process = 1



-------------------------------
-- dm_os_waiting_tasks - tip 2732
-------------------------------   
SELECT   w.session_id
,w.wait_duration_ms
,w.wait_type
,w.blocking_session_id
,w.resource_description
,s.program_name
,t.text
,t.dbid
,s.cpu_time
,s.memory_usage
FROM sys.dm_os_waiting_tasks w
INNER JOIN sys.dm_exec_sessions s
ON w.session_id = s.session_id
INNER JOIN sys.dm_exec_requests r
ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) t
WHERE s.is_user_process = 1
GO



-------------------------------
-- Current blocked processes
-------------------------------
select a.blocking_session_id,a.last_wait_type,a.wait_resource,b.text,a.session_id,a.start_time,a.status,a.command,db_name(a.database_id) as database_name
,object_name(b.objectid,b.dbid) as object_name,a.user_id ,c.login_name 
,a.wait_time,a.cpu_time,a.total_elapsed_time,a.writes
,a.reads,a.logical_reads,a.granted_query_memory,a.nest_level,a.row_count,a.transaction_isolation_level
from sys.dm_exec_requests as a
cross apply sys.dm_exec_sql_text(sql_handle) as b inner join sys.dm_exec_sessions as c on a.session_id=c.session_id 
where blocking_session_id <> 0
order by a.session_id



-------------------------------
-- Find lead blocking process
-------------------------------
SELECT
     spid
     ,sp.STATUS
     ,loginame   = SUBSTRING(loginame, 1, 12)
     ,hostname   = SUBSTRING(hostname, 1, 12)
     ,blk        = CONVERT(CHAR(3), blocked)
     ,open_tran
     ,dbname     = SUBSTRING(DB_NAME(sp.dbid),1,10)
     ,cmd
     ,waittype
     ,waittime
     ,last_batch
     ,SQLStatement       =
         SUBSTRING
         (
             qt.text,
             er.statement_start_offset/2,
             (CASE WHEN er.statement_end_offset = -1
                 THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2
                 ELSE er.statement_end_offset
                 END - er.statement_start_offset)/2
         )
FROM master.dbo.sysprocesses sp
LEFT JOIN sys.dm_exec_requests er
     ON er.session_id = sp.spid
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses)
AND blocked = 0
An unhandled error has occurred. Reload 🗙