5
5
ALTER PROCEDURE dbo .sp_BlitzWho
6
6
@Help TINYINT = 0 ,
7
7
@ShowSleepingSPIDs TINYINT = 0 ,
8
+ @ExpertMode BIT = 0 ,
8
9
@Debug BIT = 0 ,
9
10
@VersionDate DATETIME = NULL OUTPUT
10
11
AS
@@ -146,8 +147,6 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
146
147
) AS [elapsed_time] ,
147
148
s.session_id ,
148
149
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 ,
151
150
ISNULL(SUBSTRING(dest.text,
152
151
( query_stats.statement_start_offset / 2 ) + 1,
153
152
( ( CASE query_stats.statement_end_offset
@@ -156,22 +155,44 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
156
155
END - query_stats.statement_start_offset )
157
156
/ 2 ) + 1), dest.text) AS query_text ,
158
157
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,
165
185
COALESCE(r.logical_reads, s.logical_reads) AS request_logical_reads,
166
186
COALESCE(r.writes, s.writes) AS request_writes,
167
187
COALESCE(r.reads, s.reads) AS request_physical_reads ,
168
188
s.cpu_time AS session_cpu,
169
- tempdb_allocations.tempdb_allocations_mb,
170
189
s.logical_reads AS session_logical_reads,
171
190
s.reads AS session_physical_reads ,
172
- s.writes AS session_writes,
191
+ s.writes AS session_writes,
192
+ tempdb_allocations.tempdb_allocations_mb,
173
193
s.memory_usage ,
174
- r.estimated_completion_time ,
194
+ r.estimated_completion_time ,
195
+ r.percent_complete ,
175
196
r.deadlock_priority ,
176
197
CASE
177
198
WHEN s.transaction_isolation_level = 0 THEN '' Unspecified''
@@ -182,10 +203,8 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
182
203
WHEN s.transaction_isolation_level = 4 THEN '' Serializable''
183
204
WHEN s.transaction_isolation_level = 5 THEN '' Snapshot''
184
205
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 ,
189
208
COALESCE(CAST(qmg.grant_time AS VARCHAR(20)), '' N/A'' ) AS grant_time ,
190
209
qmg.requested_memory_kb ,
191
210
qmg.granted_memory_kb AS grant_memory_kb,
@@ -195,7 +214,7 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
195
214
ELSE '' Memory Request Granted''
196
215
END AS is_request_granted ,
197
216
qmg.required_memory_kb ,
198
- qmg.used_memory_kb ,
217
+ qmg.used_memory_kb AS query_memory_grant_used_memory_kb ,
199
218
qmg.ideal_memory_kb ,
200
219
qmg.is_small ,
201
220
qmg.timeout_sec ,
@@ -214,24 +233,20 @@ SET @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
214
233
qrs.total_memory_kb ,
215
234
qrs.available_memory_kb ,
216
235
qrs.granted_memory_kb ,
217
- qrs.used_memory_kb ,
236
+ qrs.used_memory_kb AS query_resource_semaphore_used_memory_kb ,
218
237
qrs.grantee_count ,
219
238
qrs.waiter_count ,
220
239
qrs.timeout_error_count ,
221
240
COALESCE(CAST(qrs.forced_grant_count AS VARCHAR(20)),
222
241
'' 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 ,
232
242
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
235
250
LEFT JOIN sys.dm_exec_requests AS r
236
251
ON r.session_id = s.session_id
237
252
LEFT JOIN ( SELECT DISTINCT
@@ -341,51 +356,64 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
341
356
) AS [elapsed_time] ,
342
357
s.session_id ,
343
358
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 ,
357
359
ISNULL(SUBSTRING(dest.text,
358
360
( query_stats.statement_start_offset / 2 ) + 1,
359
361
( ( CASE query_stats.statement_end_offset
360
362
WHEN -1 THEN DATALENGTH(dest.text)
361
363
ELSE query_stats.statement_end_offset
362
364
END - query_stats.statement_start_offset )
363
365
/ 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,
371
404
COALESCE(r.logical_reads, s.logical_reads) AS request_logical_reads,
372
405
COALESCE(r.writes, s.writes) AS request_writes,
373
406
COALESCE(r.reads, s.reads) AS request_physical_reads ,
374
407
s.cpu_time AS session_cpu,
375
- tempdb_allocations.tempdb_allocations_mb,
376
408
s.logical_reads AS session_logical_reads,
377
409
s.reads AS session_physical_reads ,
378
410
s.writes AS session_writes,
411
+ tempdb_allocations.tempdb_allocations_mb,
379
412
s.memory_usage ,
380
413
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
389
417
WHEN s.transaction_isolation_level = 0 THEN '' Unspecified''
390
418
WHEN s.transaction_isolation_level = 1 THEN '' Read Uncommitted''
391
419
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;
395
423
WHEN s.transaction_isolation_level = 5 THEN '' Snapshot''
396
424
ELSE '' WHAT HAVE YOU DONE?''
397
425
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'
401
434
COALESCE(CAST(qmg.grant_time AS VARCHAR(20)), '' Memory Not Granted'' ) AS grant_time ,
402
435
qmg.requested_memory_kb ,
403
436
qmg.granted_memory_kb AS grant_memory_kb,
@@ -407,7 +440,7 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
407
440
ELSE '' Memory Request Granted''
408
441
END AS is_request_granted ,
409
442
qmg.required_memory_kb ,
410
- qmg.used_memory_kb ,
443
+ qmg.used_memory_kb AS query_memory_grant_used_memory_kb ,
411
444
qmg.ideal_memory_kb ,
412
445
qmg.is_small ,
413
446
qmg.timeout_sec ,
@@ -426,24 +459,20 @@ SELECT @StringToExecute = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
426
459
qrs.total_memory_kb ,
427
460
qrs.available_memory_kb ,
428
461
qrs.granted_memory_kb ,
429
- qrs.used_memory_kb ,
462
+ qrs.used_memory_kb AS query_resource_semaphore_used_memory_kb ,
430
463
qrs.grantee_count ,
431
464
qrs.waiter_count ,
432
465
qrs.timeout_error_count ,
433
466
COALESCE(CAST(qrs.forced_grant_count AS VARCHAR(20)),
434
467
'' 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 ,
444
468
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
447
476
LEFT JOIN sys.dm_exec_requests AS r
448
477
ON r.session_id = s.session_id
449
478
LEFT JOIN ( SELECT DISTINCT
0 commit comments