Skip to content

Commit 187881c

Browse files
authored
Merge pull request BrentOzarULTD#1315 from BrentOzarULTD/issue_1188
Issue 1188
2 parents 6e1398f + 4edfcc3 commit 187881c

File tree

1 file changed

+112
-83
lines changed

1 file changed

+112
-83
lines changed

sp_BlitzWho.sql

+112-83
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ GO
55
ALTER 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
1011
AS
@@ -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,11 +203,9 @@ 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 ,
189-
COALESCE(CAST(qmg.grant_time AS VARCHAR), ''N/A'') AS grant_time ,
206+
END AS transaction_isolation_level ,
207+
qmg.dop AS degree_of_parallelism ,
208+
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,
192211
CASE WHEN qmg.grant_time IS NULL THEN ''N/A''
@@ -195,43 +214,39 @@ 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 ,
202221
qmg.resource_semaphore_id ,
203-
COALESCE(CAST(qmg.wait_order AS VARCHAR), ''N/A'') AS wait_order ,
204-
COALESCE(CAST(qmg.wait_time_ms AS VARCHAR),
222+
COALESCE(CAST(qmg.wait_order AS VARCHAR(20)), ''N/A'') AS wait_order ,
223+
COALESCE(CAST(qmg.wait_time_ms AS VARCHAR(20)),
205224
''N/A'') AS wait_time_ms ,
206225
CASE qmg.is_next_candidate
207226
WHEN 0 THEN ''No''
208227
WHEN 1 THEN ''Yes''
209228
ELSE ''N/A''
210229
END AS next_candidate_for_memory_grant ,
211230
qrs.target_memory_kb ,
212-
COALESCE(CAST(qrs.max_target_memory_kb AS VARCHAR),
231+
COALESCE(CAST(qrs.max_target_memory_kb AS VARCHAR(20)),
213232
''Small Query Resource Semaphore'') AS max_target_memory_kb ,
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 ,
221-
COALESCE(CAST(qrs.forced_grant_count AS VARCHAR),
240+
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,10 +423,15 @@ 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 ,
401-
COALESCE(CAST(qmg.grant_time AS VARCHAR), ''Memory Not Granted'') AS grant_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'
434+
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,
404437
CASE WHEN qmg.grant_time IS NULL THEN ''N/A''
@@ -407,43 +440,39 @@ 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 ,
414447
qmg.resource_semaphore_id ,
415-
COALESCE(CAST(qmg.wait_order AS VARCHAR), ''N/A'') AS wait_order ,
416-
COALESCE(CAST(qmg.wait_time_ms AS VARCHAR),
448+
COALESCE(CAST(qmg.wait_order AS VARCHAR(20)), ''N/A'') AS wait_order ,
449+
COALESCE(CAST(qmg.wait_time_ms AS VARCHAR(20)),
417450
''N/A'') AS wait_time_ms ,
418451
CASE qmg.is_next_candidate
419452
WHEN 0 THEN ''No''
420453
WHEN 1 THEN ''Yes''
421454
ELSE ''N/A''
422455
END AS next_candidate_for_memory_grant ,
423456
qrs.target_memory_kb ,
424-
COALESCE(CAST(qrs.max_target_memory_kb AS VARCHAR),
457+
COALESCE(CAST(qrs.max_target_memory_kb AS VARCHAR(20)),
425458
''Small Query Resource Semaphore'') AS max_target_memory_kb ,
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 ,
433-
COALESCE(CAST(qrs.forced_grant_count AS VARCHAR),
466+
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

Comments
 (0)