55ALTER PROCEDURE dbo .sp_BlitzWho
66 @Help TINYINT = 0 ,
77 @ShowSleepingSPIDs TINYINT = 0 ,
8+ @ExpertMode BIT = 0 ,
89 @Debug BIT = 0 ,
910 @VersionDate DATETIME = NULL OUTPUT
1011AS
@@ -146,8 +147,6 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
146147 ) AS [elapsed_time] ,
147148 s.session_id ,
148149 COALESCE(DB_NAME(r.database_id), DB_NAME(blocked.dbid), '' N/A'' ) AS database_name,
149- COALESCE(wt.wait_info, RTRIM(blocked.lastwaittype) + '' ('' + CONVERT(VARCHAR(10), blocked.waittime) + '' )'' ) AS wait_info ,
150- s.status ,
151150 ISNULL(SUBSTRING(dest.text,
152151 ( query_stats.statement_start_offset / 2 ) + 1,
153152 ( ( CASE query_stats.statement_end_offset
@@ -156,22 +155,44 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
156155 END - query_stats.statement_start_offset )
157156 / 2 ) + 1), dest.text) AS query_text ,
158157 derp.query_plan ,
159- qmg.query_cost ,
160- CASE WHEN r.blocking_session_id <> 0 AND blocked.session_id IS NULL THEN r.blocking_session_id
161- WHEN r.blocking_session_id <> 0 AND s.session_id <> blocked.blocking_session_id THEN blocked.blocking_session_id
162- ELSE NULL END
163- AS blocking_session_id,
164- COALESCE(r.cpu_time, s.cpu_time) AS request_cpu_time,
158+ qmg.query_cost ,
159+ s.status ,
160+ COALESCE(wt.wait_info, RTRIM(blocked.lastwaittype) + '' ('' + CONVERT(VARCHAR(10),
161+ blocked.waittime) + '' )'' ) AS wait_info ,
162+ CASE WHEN r.blocking_session_id <> 0 AND blocked.session_id IS NULL
163+ THEN r.blocking_session_id
164+ WHEN r.blocking_session_id <> 0 AND s.session_id <> blocked.blocking_session_id
165+ THEN blocked.blocking_session_id
166+ ELSE NULL
167+ END AS blocking_session_id,
168+ COALESCE(r.open_transaction_count, blocked.open_tran) AS open_transaction_count ,
169+ s.nt_domain ,
170+ s.host_name ,
171+ s.login_name ,
172+ s.nt_user_name ,
173+ s.program_name
174+ '
175+
176+ IF @ExpertMode = 1
177+ BEGIN
178+ SET @StringToExecute + =
179+ N' ,
180+ s.client_interface_name ,
181+ s.login_time ,
182+ r.start_time ,
183+ qmg.request_time ,
184+ COALESCE(r.cpu_time, s.cpu_time) AS request_cpu_time,
165185 COALESCE(r.logical_reads, s.logical_reads) AS request_logical_reads,
166186 COALESCE(r.writes, s.writes) AS request_writes,
167187 COALESCE(r.reads, s.reads) AS request_physical_reads ,
168188 s.cpu_time AS session_cpu,
169- tempdb_allocations.tempdb_allocations_mb,
170189 s.logical_reads AS session_logical_reads,
171190 s.reads AS session_physical_reads ,
172- s.writes AS session_writes,
191+ s.writes AS session_writes,
192+ tempdb_allocations.tempdb_allocations_mb,
173193 s.memory_usage ,
174- r.estimated_completion_time ,
194+ r.estimated_completion_time ,
195+ r.percent_complete ,
175196 r.deadlock_priority ,
176197 CASE
177198 WHEN s.transaction_isolation_level = 0 THEN '' Unspecified''
@@ -182,10 +203,8 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
182203 WHEN s.transaction_isolation_level = 4 THEN '' Serializable''
183204 WHEN s.transaction_isolation_level = 5 THEN '' Snapshot''
184205 ELSE '' WHAT HAVE YOU DONE?''
185- END AS transaction_isolation_level ,
186- COALESCE(r.open_transaction_count, blocked.open_tran) AS open_transaction_count ,
187- qmg.dop AS degree_of_parallelism ,
188- qmg.request_time ,
206+ END AS transaction_isolation_level ,
207+ qmg.dop AS degree_of_parallelism ,
189208 COALESCE(CAST(qmg.grant_time AS VARCHAR(20)), '' N/A'' ) AS grant_time ,
190209 qmg.requested_memory_kb ,
191210 qmg.granted_memory_kb AS grant_memory_kb,
@@ -195,7 +214,7 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
195214 ELSE '' Memory Request Granted''
196215 END AS is_request_granted ,
197216 qmg.required_memory_kb ,
198- qmg.used_memory_kb ,
217+ qmg.used_memory_kb AS query_memory_grant_used_memory_kb ,
199218 qmg.ideal_memory_kb ,
200219 qmg.is_small ,
201220 qmg.timeout_sec ,
@@ -214,24 +233,20 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
214233 qrs.total_memory_kb ,
215234 qrs.available_memory_kb ,
216235 qrs.granted_memory_kb ,
217- qrs.used_memory_kb ,
236+ qrs.used_memory_kb AS query_resource_semaphore_used_memory_kb ,
218237 qrs.grantee_count ,
219238 qrs.waiter_count ,
220239 qrs.timeout_error_count ,
221240 COALESCE(CAST(qrs.forced_grant_count AS VARCHAR(20)),
222241 '' Small Query Resource Semaphore'' ) AS forced_grant_count,
223- s.nt_domain ,
224- s.host_name ,
225- s.login_name ,
226- s.nt_user_name ,
227- s.program_name ,
228- s.client_interface_name ,
229- s.login_time ,
230- r.start_time ,
231- r.percent_complete ,
232242 wg.name AS workload_group_name ,
233- rp.name AS resource_pool_name
234- FROM sys.dm_exec_sessions AS s
243+ rp.name AS resource_pool_name,
244+ CONVERT(VARCHAR(128), r.context_info) AS context_info
245+ '
246+ END
247+
248+ SET @StringToExecute + =
249+ N' FROM sys.dm_exec_sessions AS s
235250 LEFT JOIN sys.dm_exec_requests AS r
236251 ON r.session_id = s.session_id
237252 LEFT JOIN ( SELECT DISTINCT
@@ -341,51 +356,64 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
341356 ) AS [elapsed_time] ,
342357 s.session_id ,
343358 COALESCE(DB_NAME(r.database_id), DB_NAME(blocked.dbid), '' N/A'' ) AS database_name,
344- COALESCE(wt.wait_info, RTRIM(blocked.lastwaittype) + '' ('' + CONVERT(VARCHAR(10), blocked.waittime) + '' )'' ) AS wait_info ,
345- ' +
346- CASE @SessionWaits
347- WHEN 1 THEN + N ' SUBSTRING(wt2.session_wait_info, 0, LEN(wt2.session_wait_info) ) AS top_session_waits ,'
348- ELSE N ' '
349- END
350- +
351- CASE @QueryStatsXML
352- WHEN 1 THEN + @QueryStatsXMLselect
353- ELSE N ' '
354- END
355- + '
356- s.status ,
357359 ISNULL(SUBSTRING(dest.text,
358360 ( query_stats.statement_start_offset / 2 ) + 1,
359361 ( ( CASE query_stats.statement_end_offset
360362 WHEN -1 THEN DATALENGTH(dest.text)
361363 ELSE query_stats.statement_end_offset
362364 END - query_stats.statement_start_offset )
363365 / 2 ) + 1), dest.text) AS query_text ,
364- derp.query_plan ,
365- qmg.query_cost ,
366- CASE WHEN r.blocking_session_id <> 0 AND blocked.session_id IS NULL THEN r.blocking_session_id
367- WHEN r.blocking_session_id <> 0 AND s.session_id <> blocked.blocking_session_id THEN blocked.blocking_session_id
368- ELSE NULL END
369- AS blocking_session_id,
370- COALESCE(r.cpu_time, s.cpu_time) AS request_cpu_time,
366+ derp.query_plan ,'
367+ +
368+ CASE @QueryStatsXML
369+ WHEN 1 THEN + @QueryStatsXMLselect
370+ ELSE N ' '
371+ END
372+ + '
373+ qmg.query_cost ,
374+ s.status ,
375+ COALESCE(wt.wait_info, RTRIM(blocked.lastwaittype) + '' ('' + CONVERT(VARCHAR(10), blocked.waittime) + '' )'' ) AS wait_info ,'
376+ +
377+ CASE @SessionWaits
378+ WHEN 1 THEN + N ' SUBSTRING(wt2.session_wait_info, 0, LEN(wt2.session_wait_info) ) AS top_session_waits ,'
379+ ELSE N ' '
380+ END
381+ +
382+ N' CASE WHEN r.blocking_session_id <> 0 AND blocked.session_id IS NULL
383+ THEN r.blocking_session_id
384+ WHEN r.blocking_session_id <> 0 AND s.session_id <> blocked.blocking_session_id
385+ THEN blocked.blocking_session_id
386+ ELSE NULL
387+ END AS blocking_session_id,
388+ COALESCE(r.open_transaction_count, blocked.open_tran) AS open_transaction_count ,
389+ s.nt_domain ,
390+ s.host_name ,
391+ s.login_name ,
392+ s.nt_user_name ,
393+ s.program_name
394+ '
395+ IF @ExpertMode = 1
396+ BEGIN
397+ SET @StringToExecute + =
398+ N' ,
399+ s.client_interface_name ,
400+ s.login_time ,
401+ r.start_time ,
402+ qmg.request_time ,
403+ COALESCE(r.cpu_time, s.cpu_time) AS request_cpu_time,
371404 COALESCE(r.logical_reads, s.logical_reads) AS request_logical_reads,
372405 COALESCE(r.writes, s.writes) AS request_writes,
373406 COALESCE(r.reads, s.reads) AS request_physical_reads ,
374407 s.cpu_time AS session_cpu,
375- tempdb_allocations.tempdb_allocations_mb,
376408 s.logical_reads AS session_logical_reads,
377409 s.reads AS session_physical_reads ,
378410 s.writes AS session_writes,
411+ tempdb_allocations.tempdb_allocations_mb,
379412 s.memory_usage ,
380413 r.estimated_completion_time ,
381- r.deadlock_priority ,'
382- +
383- CASE @EnhanceFlag
384- WHEN 1 THEN @EnhanceSQL
385- ELSE N ' '
386- END
387- +
388- N' CASE
414+ r.percent_complete ,
415+ r.deadlock_priority ,
416+ CASE
389417 WHEN s.transaction_isolation_level = 0 THEN '' Unspecified''
390418 WHEN s.transaction_isolation_level = 1 THEN '' Read Uncommitted''
391419 WHEN s.transaction_isolation_level = 2 AND EXISTS (SELECT 1 FROM sys.dm_tran_active_snapshot_database_transactions AS trn WHERE s.session_id = trn.session_id AND is_snapshot = 0 ) THEN '' Read Committed Snapshot Isolation''
@@ -395,9 +423,14 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
395423 WHEN s.transaction_isolation_level = 5 THEN '' Snapshot''
396424 ELSE '' WHAT HAVE YOU DONE?''
397425 END AS transaction_isolation_level ,
398- COALESCE(r.open_transaction_count, blocked.open_tran) AS open_transaction_count ,
399- qmg.dop AS degree_of_parallelism ,
400- qmg.request_time ,
426+ qmg.dop AS degree_of_parallelism , '
427+ +
428+ CASE @EnhanceFlag
429+ WHEN 1 THEN @EnhanceSQL
430+ ELSE N ' '
431+ END
432+ +
433+ N'
401434 COALESCE(CAST(qmg.grant_time AS VARCHAR(20)), '' Memory Not Granted'' ) AS grant_time ,
402435 qmg.requested_memory_kb ,
403436 qmg.granted_memory_kb AS grant_memory_kb,
@@ -407,7 +440,7 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
407440 ELSE '' Memory Request Granted''
408441 END AS is_request_granted ,
409442 qmg.required_memory_kb ,
410- qmg.used_memory_kb ,
443+ qmg.used_memory_kb AS query_memory_grant_used_memory_kb ,
411444 qmg.ideal_memory_kb ,
412445 qmg.is_small ,
413446 qmg.timeout_sec ,
@@ -426,24 +459,20 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
426459 qrs.total_memory_kb ,
427460 qrs.available_memory_kb ,
428461 qrs.granted_memory_kb ,
429- qrs.used_memory_kb ,
462+ qrs.used_memory_kb AS query_resource_semaphore_used_memory_kb ,
430463 qrs.grantee_count ,
431464 qrs.waiter_count ,
432465 qrs.timeout_error_count ,
433466 COALESCE(CAST(qrs.forced_grant_count AS VARCHAR(20)),
434467 '' Small Query Resource Semaphore'' ) AS forced_grant_count,
435- s.nt_domain ,
436- s.host_name ,
437- s.login_name ,
438- s.nt_user_name ,
439- s.program_name ,
440- s.client_interface_name ,
441- s.login_time ,
442- r.start_time ,
443- r.percent_complete ,
444468 wg.name AS workload_group_name,
445- rp.name AS resource_pool_name
446- FROM sys.dm_exec_sessions AS s
469+ rp.name AS resource_pool_name,
470+ CONVERT(VARCHAR(128), r.context_info) AS context_info
471+ '
472+ END
473+
474+ SET @StringToExecute + =
475+ N' FROM sys.dm_exec_sessions AS s
447476 LEFT JOIN sys.dm_exec_requests AS r
448477 ON r.session_id = s.session_id
449478 LEFT JOIN ( SELECT DISTINCT
0 commit comments