THE SQL Server Blog Spot on the Web

Welcome to SQLblog.com - The SQL Server blog spot on the web Sign in | Join | Help
in Search

John Paul Cook

Using the Processes query outside of Activity Monitor

After Adam and Linchi posted their queries for analyzing performance, I thought I'd show you one I run. I'm sure you run it, too. It's the Processes query from the Activity Monitor. Usually I run it from Activity Monitor, but sometimes the Activity Monitor UI just doesn't do what I want. I ran SQL Profiler to find out exactly what is executed behind the scenes. Executing the Processes query in a query window is great for when you need to persist the results. 

/* ACTIVITY MONITOR */

 

/* Processes */

SELECT

   [Session ID]    = s.session_id,

   [User Process]  = CONVERT(CHAR(1), s.is_user_process),

   [Login]         = s.login_name,  

   [Database]      = ISNULL(db_name(r.database_id), N''),

   [Task State]    = ISNULL(t.task_state, N''),

   [Command]       = ISNULL(r.command, N''),

   [Application]   = ISNULL(s.program_name, N''),

   [Wait Time (ms)]     = ISNULL(w.wait_duration_ms, 0),

   [Wait Type]     = ISNULL(w.wait_type, N''),

   [Wait Resource] = ISNULL(w.resource_description, N''),

   [Blocked By]    = ISNULL(CONVERT (varchar, w.blocking_session_id), ''),

   [Head Blocker]  =

        CASE

            -- session has an active request, is blocked, but is blocking others

            WHEN r2.session_id IS NOT NULL AND r.blocking_session_id = 0 THEN '1'

            -- session is idle but has an open tran and is blocking others

            WHEN r.session_id IS NULL THEN '1'

            ELSE ''

        END,

   [Total CPU (ms)] = s.cpu_time,

   [Total Physical I/O (MB)]   = (s.reads + s.writes) * 8 / 1024,

   [Memory Use (KB)]  = s.memory_usage * 8192 / 1024,

   [Open Transactions] = ISNULL(r.open_transaction_count,0),

   [Login Time]    = s.login_time,

   [Last Request Start Time] = s.last_request_start_time,

   [Host Name]     = ISNULL(s.host_name, N''),

   [Net Address]   = ISNULL(c.client_net_address, N''),

   [Execution Context ID] = ISNULL(t.exec_context_id, 0),

   [Request ID] = ISNULL(r.request_id, 0),

   [Workload Group] = N''

FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_connections c ON (s.session_id = c.session_id)

LEFT OUTER JOIN sys.dm_exec_requests r ON (s.session_id = r.session_id)

LEFT OUTER JOIN sys.dm_os_tasks t ON (r.session_id = t.session_id AND r.request_id = t.request_id)

LEFT OUTER JOIN

(

    -- In some cases (e.g. parallel queries, also waiting for a worker), one thread can be flagged as

    -- waiting for several different threads.  This will cause that thread to show up in multiple rows

    -- in our grid, which we don't want.  Use ROW_NUMBER to select the longest wait for each thread,

    -- and use it as representative of the other wait relationships this thread is involved in.

    SELECT *, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num

    FROM sys.dm_os_waiting_tasks

) w ON (t.task_address = w.waiting_task_address) AND w.row_num = 1

LEFT OUTER JOIN sys.dm_exec_requests r2 ON (r.session_id = r2.blocking_session_id)

ORDER BY s.session_id;

 

Published Monday, August 24, 2009 11:10 PM by John Paul Cook

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

SqlServerKudos said:

Kudos for a great Sql Server article - Trackback from SqlServerKudos

August 25, 2009 9:23 AM
 

SQLuser said:

Thanks for the great article!

March 26, 2010 2:51 PM
 

Vinnie said:

Great script.  Thanks for sharing!!!

August 20, 2010 9:41 AM
 

User said:

Thanks a Lot. How did you manage to get that?

October 13, 2010 1:10 PM
 

John Paul Cook said:

I used the SQL Server Profiler to capture what SSMS was executing.

October 13, 2010 7:07 PM
 

Skyline69 said:

Great, this is easier for me to use than Activity monitor as I can capture the information and use it to track problems.

October 21, 2010 11:23 AM

Leave a Comment

(required) 
(optional)
(required) 
Submit

About John Paul Cook

SQL Server MVP based in Houston, Texas. Contributing author to SQL Server MVP Deep Dives and SQL Server MVP Deep Dives Volume 2. John is currently on sabbatical from database consulting and is very busy as a full-time nursing student.
Powered by Community Server (Commercial Edition), by Telligent Systems
  Privacy Statement