usp_whatsup.sql 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. -- 2012-04-07 Pedro Lopes (Microsoft) (http://aka.ms/tigertoolbox/)
  2. -- Replace CREATE PROCEDURE with ALTER PROCEDURE or CREATE OR ALTER PROCEDURE to allow new changes to the SP if the SP is already present.
  3. CREATE PROCEDURE usp_whatsup @sqluptime bit = 1, @requests bit = 1, @blocking bit = 1, @spstats bit = 0, @qrystats bit = 0, @trstats bit = 0, @fnstats bit = 0, @top smallint = 100
  4. AS
  5. -- Returns running sessions/requests; blocking information; sessions that have been granted locks or waiting for locks; and optionally top SP/Query/Trigger/Function execution stats.
  6. SET NOCOUNT ON;
  7. DECLARE @sqlmajorver int, @sqlbuild int, @sqlcmd VARCHAR(8000), @sqlcmdup NVARCHAR(500), @params NVARCHAR(500)
  8. SELECT @sqlmajorver = CONVERT(int, (@@microsoftversion / 0x1000000) & 0xff);
  9. SELECT @sqlbuild = CONVERT(int, @@microsoftversion & 0xffff);
  10. IF @sqluptime = 1
  11. BEGIN
  12. DECLARE @UpTime VARCHAR(12), @StartDate DATETIME
  13. IF @sqlmajorver = 9
  14. BEGIN
  15. SET @sqlcmdup = N'SELECT @StartDateOUT = login_time, @UpTimeOUT = DATEDIFF(mi, login_time, GETDATE()) FROM master..sysprocesses WHERE spid = 1';
  16. END
  17. ELSE
  18. BEGIN
  19. SET @sqlcmdup = N'SELECT @StartDateOUT = sqlserver_start_time, @UpTimeOUT = DATEDIFF(mi,sqlserver_start_time,GETDATE()) FROM sys.dm_os_sys_info';
  20. END
  21. SET @params = N'@StartDateOUT DATETIME OUTPUT, @UpTimeOUT VARCHAR(12) OUTPUT';
  22. EXECUTE sp_executesql @sqlcmdup, @params, @StartDateOUT=@StartDate OUTPUT, @UpTimeOUT=@UpTime OUTPUT;
  23. SELECT 'Uptime_Information' AS [Information], GETDATE() AS [Current_Time], @StartDate AS Last_Startup, CONVERT(VARCHAR(4),@UpTime/60/24) + 'd ' + CONVERT(VARCHAR(4),@UpTime/60%24) + 'h ' + CONVERT(VARCHAR(4),@UpTime%60) + 'm' AS Uptime
  24. END;
  25. -- Running Sessions/Requests Report
  26. IF @requests = 1
  27. BEGIN
  28. IF @sqlmajorver = 9
  29. BEGIN
  30. SELECT @sqlcmd = N'SELECT ''Requests'' AS [Information], es.session_id, DB_NAME(er.database_id) AS [database_name], OBJECT_NAME(qp.objectid, qp.dbid) AS [object_name], -- NULL if Ad-Hoc or Prepared statements
  31. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  32. qt.text,
  33. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  34. AS [text()]
  35. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
  36. FOR XML PATH(''''), TYPE) AS [running_batch],
  37. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  38. SUBSTRING(qt2.text,
  39. 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
  40. 1+(CASE WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er.statement_end_offset/2 END - (CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END))),
  41. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  42. AS [text()]
  43. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt2
  44. FOR XML PATH(''''), TYPE) AS [running_statement],
  45. --ot.task_state AS [status],
  46. er.status,
  47. --er.command,
  48. qp.query_plan,
  49. er.percent_complete,
  50. CONVERT(VARCHAR(20),DATEADD(ms,er.estimated_completion_time,GETDATE()),20) AS [ETA_completion_time],
  51. (er.cpu_time/1000) AS cpu_time_sec,
  52. (er.reads*8)/1024 AS physical_reads_KB,
  53. (er.logical_reads*8)/1024 AS logical_reads_KB,
  54. (er.writes*8)/1024 AS writes_KB,
  55. (er.total_elapsed_time/1000)/60 AS elapsed_minutes,
  56. er.wait_type,
  57. er.wait_resource,
  58. er.last_wait_type,
  59. (SELECT CASE
  60. WHEN pageid = 1 OR pageid % 8088 = 0 THEN ''Is_PFS_Page''
  61. WHEN pageid = 2 OR pageid % 511232 = 0 THEN ''Is_GAM_Page''
  62. WHEN pageid = 3 OR (pageid - 1) % 511232 = 0 THEN ''Is_SGAM_Page''
  63. WHEN pageid IS NULL THEN NULL
  64. ELSE ''Is_not_PFS_GAM_SGAM_page'' END
  65. FROM (SELECT CASE WHEN er.[wait_type] LIKE ''PAGE%LATCH%'' AND er.[wait_resource] LIKE ''%:%''
  66. THEN CAST(RIGHT(er.[wait_resource], LEN(er.[wait_resource]) - CHARINDEX('':'', er.[wait_resource], LEN(er.[wait_resource])-CHARINDEX('':'', REVERSE(er.[wait_resource])))) AS int)
  67. ELSE NULL END AS pageid) AS latch_pageid
  68. ) AS wait_resource_type,
  69. er.wait_time AS wait_time_ms,
  70. er.cpu_time AS cpu_time_ms,
  71. er.open_transaction_count,
  72. DATEADD(s, (er.estimated_completion_time/1000), GETDATE()) AS estimated_completion_time,
  73. LEFT (CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
  74. WHEN 0 THEN ''0-Unspecified''
  75. WHEN 1 THEN ''1-ReadUncommitted''
  76. WHEN 2 THEN ''2-ReadCommitted''
  77. WHEN 3 THEN ''3-RepeatableRead''
  78. WHEN 4 THEN ''4-Serializable''
  79. WHEN 5 THEN ''5-Snapshot''
  80. ELSE CONVERT (VARCHAR(30), er.transaction_isolation_level) + ''-UNKNOWN''
  81. END, 30) AS transaction_isolation_level,
  82. mg.requested_memory_kb,
  83. mg.granted_memory_kb,
  84. --mg.ideal_memory_kb,
  85. mg.query_cost,
  86. es.[host_name],
  87. es.login_name,
  88. --es.original_login_name,
  89. es.[program_name],
  90. --ec.client_net_address,
  91. es.is_user_process
  92. FROM sys.dm_exec_requests (NOLOCK) er
  93. LEFT OUTER JOIN sys.dm_exec_query_memory_grants (NOLOCK) mg ON er.session_id = mg.session_id AND er.request_id = mg.request_id
  94. LEFT OUTER JOIN sys.dm_db_session_space_usage (NOLOCK) ssu ON er.session_id = ssu.session_id
  95. LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es ON er.session_id = es.session_id
  96. OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp
  97. WHERE er.session_id <> @@SPID AND es.is_user_process = 1
  98. ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
  99. END
  100. ELSE IF @sqlmajorver IN (10,11,12) OR (@sqlmajorver = 13 AND @sqlbuild < 4000)
  101. BEGIN
  102. SET @sqlcmd = N';WITH tsu AS (SELECT session_id, SUM(user_objects_alloc_page_count) AS user_objects_alloc_page_count,
  103. SUM(user_objects_dealloc_page_count) AS user_objects_dealloc_page_count,
  104. SUM(internal_objects_alloc_page_count) AS internal_objects_alloc_page_count,
  105. SUM(internal_objects_dealloc_page_count) AS internal_objects_dealloc_page_count FROM sys.dm_db_task_space_usage (NOLOCK) GROUP BY session_id)
  106. SELECT ''Requests'' AS [Information], es.session_id, DB_NAME(er.database_id) AS [database_name], OBJECT_NAME(qp.objectid, qp.dbid) AS [object_name],
  107. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  108. qt.text,
  109. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  110. AS [text()]
  111. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
  112. FOR XML PATH(''''), TYPE) AS [running_batch],
  113. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  114. SUBSTRING(qt2.text,
  115. 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
  116. 1+(CASE WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er.statement_end_offset/2 END - (CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END))),
  117. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  118. AS [text()]
  119. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt2
  120. FOR XML PATH(''''), TYPE) AS [running_statement],
  121. er.status,
  122. er.command,
  123. qp.query_plan,
  124. er.percent_complete,
  125. CONVERT(VARCHAR(20),DATEADD(ms,er.estimated_completion_time,GETDATE()),20) AS [ETA_completion_time],
  126. (er.cpu_time/1000) AS cpu_time_sec,
  127. (er.reads*8)/1024 AS physical_reads_KB,
  128. (er.logical_reads*8)/1024 AS logical_reads_KB,
  129. (er.writes*8)/1024 AS writes_KB,
  130. (er.total_elapsed_time/1000)/60 AS elapsed_minutes,
  131. er.wait_type,
  132. er.wait_resource,
  133. er.last_wait_type,
  134. (SELECT CASE
  135. WHEN pageid = 1 OR pageid % 8088 = 0 THEN ''Is_PFS_Page''
  136. WHEN pageid = 2 OR pageid % 511232 = 0 THEN ''Is_GAM_Page''
  137. WHEN pageid = 3 OR (pageid - 1) % 511232 = 0 THEN ''Is_SGAM_Page''
  138. WHEN pageid IS NULL THEN NULL
  139. ELSE ''Is_not_PFS_GAM_SGAM_page'' END
  140. FROM (SELECT CASE WHEN er.[wait_type] LIKE ''PAGE%LATCH%'' AND er.[wait_resource] LIKE ''%:%''
  141. THEN CAST(RIGHT(er.[wait_resource], LEN(er.[wait_resource]) - CHARINDEX('':'', er.[wait_resource], LEN(er.[wait_resource])-CHARINDEX('':'', REVERSE(er.[wait_resource])))) AS int)
  142. ELSE NULL END AS pageid) AS latch_pageid
  143. ) AS wait_resource_type,
  144. er.wait_time AS wait_time_ms,
  145. er.cpu_time AS cpu_time_ms,
  146. er.open_transaction_count,
  147. DATEADD(s, (er.estimated_completion_time/1000), GETDATE()) AS estimated_completion_time,
  148. CASE WHEN mg.wait_time_ms IS NULL THEN DATEDIFF(ms, mg.request_time, mg.grant_time) ELSE mg.wait_time_ms END AS [grant_wait_time_ms],
  149. LEFT (CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
  150. WHEN 0 THEN ''0-Unspecified''
  151. WHEN 1 THEN ''1-ReadUncommitted''
  152. WHEN 2 THEN ''2-ReadCommitted''
  153. WHEN 3 THEN ''3-RepeatableRead''
  154. WHEN 4 THEN ''4-Serializable''
  155. WHEN 5 THEN ''5-Snapshot''
  156. ELSE CONVERT (VARCHAR(30), er.transaction_isolation_level) + ''-UNKNOWN''
  157. END, 30) AS transaction_isolation_level,
  158. mg.requested_memory_kb,
  159. mg.granted_memory_kb,
  160. mg.ideal_memory_kb,
  161. mg.query_cost,
  162. ((((ssu.user_objects_alloc_page_count + tsu.user_objects_alloc_page_count) -
  163. (ssu.user_objects_dealloc_page_count + tsu.user_objects_dealloc_page_count))*8)/1024) AS user_obj_in_tempdb_MB,
  164. ((((ssu.internal_objects_alloc_page_count + tsu.internal_objects_alloc_page_count) -
  165. (ssu.internal_objects_dealloc_page_count + tsu.internal_objects_dealloc_page_count))*8)/1024) AS internal_obj_in_tempdb_MB,
  166. es.[host_name],
  167. es.login_name,
  168. --es.original_login_name,
  169. es.[program_name],
  170. --ec.client_net_address,
  171. es.is_user_process,
  172. g.name AS workload_group
  173. FROM sys.dm_exec_requests (NOLOCK) er
  174. LEFT OUTER JOIN sys.dm_exec_query_memory_grants (NOLOCK) mg ON er.session_id = mg.session_id AND er.request_id = mg.request_id
  175. LEFT OUTER JOIN sys.dm_db_session_space_usage (NOLOCK) ssu ON er.session_id = ssu.session_id
  176. LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es ON er.session_id = es.session_id
  177. LEFT OUTER JOIN tsu ON tsu.session_id = ssu.session_id
  178. LEFT OUTER JOIN sys.dm_resource_governor_workload_groups (NOLOCK) g ON es.group_id = g.group_id
  179. OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp
  180. WHERE er.session_id <> @@SPID AND es.is_user_process = 1
  181. ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
  182. END
  183. ELSE IF (@sqlmajorver = 13 AND @sqlbuild > 4000) OR @sqlmajorver = 14 OR (@sqlmajorver = 15 AND @sqlbuild < 1400)
  184. BEGIN
  185. SELECT @sqlcmd = N'WITH tsu AS (SELECT session_id, SUM(user_objects_alloc_page_count) AS user_objects_alloc_page_count,
  186. SUM(user_objects_dealloc_page_count) AS user_objects_dealloc_page_count,
  187. SUM(internal_objects_alloc_page_count) AS internal_objects_alloc_page_count,
  188. SUM(internal_objects_dealloc_page_count) AS internal_objects_dealloc_page_count FROM sys.dm_db_task_space_usage (NOLOCK) GROUP BY session_id)
  189. SELECT ''Requests'' AS [Information], es.session_id, DB_NAME(er.database_id) AS [database_name], OBJECT_NAME(qp.objectid, qp.dbid) AS [object_name],
  190. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  191. qt.text,
  192. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  193. AS [text()]
  194. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
  195. FOR XML PATH(''''), TYPE) AS [running_batch],
  196. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  197. SUBSTRING(qt2.text,
  198. 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
  199. 1+(CASE WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er.statement_end_offset/2 END - (CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END))),
  200. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  201. AS [text()]
  202. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt2
  203. FOR XML PATH(''''), TYPE) AS [running_statement],
  204. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  205. ib.event_info,
  206. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  207. AS [text()]
  208. FROM sys.dm_exec_input_buffer(er.session_id, er.request_id) AS ib
  209. FOR XML PATH(''''), TYPE) AS [input_buffer],
  210. er.status,
  211. er.command,
  212. qp.query_plan,
  213. CASE WHEN qes.query_plan IS NULL THEN ''Lightweight Query Profiling Infrastructure is not enabled'' ELSE qes.query_plan END AS [live_query_plan_snapshot],
  214. er.percent_complete,
  215. CONVERT(VARCHAR(20),DATEADD(ms,er.estimated_completion_time,GETDATE()),20) AS [ETA_completion_time],
  216. (er.cpu_time/1000) AS cpu_time_sec,
  217. (er.reads*8)/1024 AS physical_reads_KB,
  218. (er.logical_reads*8)/1024 AS logical_reads_KB,
  219. (er.writes*8)/1024 AS writes_KB,
  220. (er.total_elapsed_time/1000)/60 AS elapsed_minutes,
  221. er.wait_type,
  222. er.wait_resource,
  223. er.last_wait_type,
  224. (SELECT CASE
  225. WHEN pageid = 1 OR pageid % 8088 = 0 THEN ''Is_PFS_Page''
  226. WHEN pageid = 2 OR pageid % 511232 = 0 THEN ''Is_GAM_Page''
  227. WHEN pageid = 3 OR (pageid - 1) % 511232 = 0 THEN ''Is_SGAM_Page''
  228. WHEN pageid IS NULL THEN NULL
  229. ELSE ''Is_not_PFS_GAM_SGAM_page'' END
  230. FROM (SELECT CASE WHEN er.[wait_type] LIKE ''PAGE%LATCH%'' AND er.[wait_resource] LIKE ''%:%''
  231. THEN CAST(RIGHT(er.[wait_resource], LEN(er.[wait_resource]) - CHARINDEX('':'', er.[wait_resource], LEN(er.[wait_resource])-CHARINDEX('':'', REVERSE(er.[wait_resource])))) AS int)
  232. ELSE NULL END AS pageid) AS latch_pageid
  233. ) AS wait_resource_type,
  234. er.wait_time AS wait_time_ms,
  235. er.cpu_time AS cpu_time_ms,
  236. er.open_transaction_count,
  237. DATEADD(s, (er.estimated_completion_time/1000), GETDATE()) AS estimated_completion_time,
  238. CASE WHEN mg.wait_time_ms IS NULL THEN DATEDIFF(ms, mg.request_time, mg.grant_time) ELSE mg.wait_time_ms END AS [grant_wait_time_ms],
  239. LEFT (CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
  240. WHEN 0 THEN ''0-Unspecified''
  241. WHEN 1 THEN ''1-ReadUncommitted''
  242. WHEN 2 THEN ''2-ReadCommitted''
  243. WHEN 3 THEN ''3-RepeatableRead''
  244. WHEN 4 THEN ''4-Serializable''
  245. WHEN 5 THEN ''5-Snapshot''
  246. ELSE CONVERT (VARCHAR(30), er.transaction_isolation_level) + ''-UNKNOWN''
  247. END, 30) AS transaction_isolation_level,
  248. mg.requested_memory_kb,
  249. mg.granted_memory_kb,
  250. mg.ideal_memory_kb,
  251. mg.query_cost,
  252. ((((ssu.user_objects_alloc_page_count + tsu.user_objects_alloc_page_count) -
  253. (ssu.user_objects_dealloc_page_count + tsu.user_objects_dealloc_page_count))*8)/1024) AS user_obj_in_tempdb_MB,
  254. ((((ssu.internal_objects_alloc_page_count + tsu.internal_objects_alloc_page_count) -
  255. (ssu.internal_objects_dealloc_page_count + tsu.internal_objects_dealloc_page_count))*8)/1024) AS internal_obj_in_tempdb_MB,
  256. es.[host_name],
  257. es.login_name,
  258. --es.original_login_name,
  259. es.[program_name],
  260. --ec.client_net_address,
  261. es.is_user_process,
  262. g.name AS workload_group
  263. FROM sys.dm_exec_requests (NOLOCK) er
  264. LEFT OUTER JOIN sys.dm_exec_query_memory_grants (NOLOCK) mg ON er.session_id = mg.session_id AND er.request_id = mg.request_id
  265. LEFT OUTER JOIN sys.dm_db_session_space_usage (NOLOCK) ssu ON er.session_id = ssu.session_id
  266. LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es ON er.session_id = es.session_id
  267. LEFT OUTER JOIN tsu ON tsu.session_id = ssu.session_id
  268. LEFT OUTER JOIN sys.dm_resource_governor_workload_groups (NOLOCK) g ON es.group_id = g.group_id
  269. OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp
  270. OUTER APPLY sys.dm_exec_query_statistics_xml(er.session_id) qes
  271. WHERE er.session_id <> @@SPID AND es.is_user_process = 1
  272. ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
  273. END
  274. ELSE IF (@sqlmajorver = 15 AND @sqlbuild >= 1400) OR @sqlmajorver > 15
  275. BEGIN
  276. SELECT @sqlcmd = N'WITH tsu AS (SELECT session_id, SUM(user_objects_alloc_page_count) AS user_objects_alloc_page_count,
  277. SUM(user_objects_dealloc_page_count) AS user_objects_dealloc_page_count,
  278. SUM(internal_objects_alloc_page_count) AS internal_objects_alloc_page_count,
  279. SUM(internal_objects_dealloc_page_count) AS internal_objects_dealloc_page_count FROM sys.dm_db_task_space_usage (NOLOCK) GROUP BY session_id)
  280. SELECT ''Requests'' AS [Information], es.session_id, DB_NAME(er.database_id) AS [database_name], OBJECT_NAME(qp.objectid, qp.dbid) AS [object_name],
  281. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  282. qt.text,
  283. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  284. AS [text()]
  285. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
  286. FOR XML PATH(''''), TYPE) AS [running_batch],
  287. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  288. SUBSTRING(qt2.text,
  289. 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
  290. 1+(CASE WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er.statement_end_offset/2 END - (CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END))),
  291. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  292. AS [text()]
  293. FROM sys.dm_exec_sql_text(er.sql_handle) AS qt2
  294. FOR XML PATH(''''), TYPE) AS [running_statement],
  295. --ot.task_state AS [status],
  296. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  297. ib.event_info,
  298. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  299. AS [text()]
  300. FROM sys.dm_exec_input_buffer(er.session_id, er.request_id) AS ib
  301. FOR XML PATH(''''), TYPE) AS [input_buffer],
  302. er.status,
  303. er.command,
  304. qp.query_plan,
  305. CASE WHEN qes.query_plan IS NULL THEN ''Lightweight Query Profiling Infrastructure is not enabled'' ELSE qes.query_plan END AS [live_query_plan_snapshot],
  306. CASE WHEN qps.query_plan IS NULL THEN ''Lightweight Query Profiling Infrastructure is not enabled'' ELSE qps.query_plan END AS [last_actual_execution_plan],
  307. er.percent_complete,
  308. CONVERT(VARCHAR(20),DATEADD(ms,er.estimated_completion_time,GETDATE()),20) AS [ETA_completion_time],
  309. (er.cpu_time/1000) AS cpu_time_sec,
  310. (er.reads*8)/1024 AS physical_reads_KB,
  311. (er.logical_reads*8)/1024 AS logical_reads_KB,
  312. (er.writes*8)/1024 AS writes_KB,
  313. (er.total_elapsed_time/1000)/60 AS elapsed_minutes,
  314. er.wait_type,
  315. er.wait_resource,
  316. er.last_wait_type,
  317. pi.page_type_desc AS wait_resource_type,
  318. er.wait_time AS wait_time_ms,
  319. er.cpu_time AS cpu_time_ms,
  320. er.open_transaction_count,
  321. DATEADD(s, (er.estimated_completion_time/1000), GETDATE()) AS estimated_completion_time,
  322. CASE WHEN mg.wait_time_ms IS NULL THEN DATEDIFF(ms, mg.request_time, mg.grant_time) ELSE mg.wait_time_ms END AS [grant_wait_time_ms],
  323. LEFT (CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
  324. WHEN 0 THEN ''0-Unspecified''
  325. WHEN 1 THEN ''1-ReadUncommitted''
  326. WHEN 2 THEN ''2-ReadCommitted''
  327. WHEN 3 THEN ''3-RepeatableRead''
  328. WHEN 4 THEN ''4-Serializable''
  329. WHEN 5 THEN ''5-Snapshot''
  330. ELSE CONVERT (VARCHAR(30), er.transaction_isolation_level) + ''-UNKNOWN''
  331. END, 30) AS transaction_isolation_level,
  332. mg.requested_memory_kb,
  333. mg.granted_memory_kb,
  334. mg.ideal_memory_kb,
  335. mg.query_cost,
  336. ((((ssu.user_objects_alloc_page_count + tsu.user_objects_alloc_page_count) -
  337. (ssu.user_objects_dealloc_page_count + tsu.user_objects_dealloc_page_count))*8)/1024) AS user_obj_in_tempdb_MB,
  338. ((((ssu.internal_objects_alloc_page_count + tsu.internal_objects_alloc_page_count) -
  339. (ssu.internal_objects_dealloc_page_count + tsu.internal_objects_dealloc_page_count))*8)/1024) AS internal_obj_in_tempdb_MB,
  340. es.[host_name],
  341. es.login_name,
  342. --es.original_login_name,
  343. es.[program_name],
  344. --ec.client_net_address,
  345. es.is_user_process,
  346. g.name AS workload_group
  347. FROM sys.dm_exec_requests (NOLOCK) er
  348. LEFT OUTER JOIN sys.dm_exec_query_memory_grants (NOLOCK) mg ON er.session_id = mg.session_id AND er.request_id = mg.request_id
  349. LEFT OUTER JOIN sys.dm_db_session_space_usage (NOLOCK) ssu ON er.session_id = ssu.session_id
  350. LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es ON er.session_id = es.session_id
  351. LEFT OUTER JOIN tsu ON tsu.session_id = ssu.session_id
  352. LEFT OUTER JOIN sys.dm_resource_governor_workload_groups (NOLOCK) g ON es.group_id = g.group_id
  353. OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp
  354. OUTER APPLY sys.dm_exec_query_statistics_xml(er.session_id) qes
  355. OUTER APPLY sys.dm_exec_query_plan_stats(er.plan_handle) qps
  356. OUTER APPLY sys.fn_PageResCracker(er.page_resource) pc
  357. OUTER APPLY sys.dm_db_page_info(ISNULL(pc.db_id, 0), ISNULL(pc.file_id, 0), ISNULL(pc.page_id, 0), ''LIMITED'') pi
  358. WHERE er.session_id <> @@SPID AND es.is_user_process = 1
  359. ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
  360. END
  361. EXECUTE (@sqlcmd)
  362. END;
  363. -- Waiter and Blocking Report
  364. IF @blocking = 1
  365. BEGIN
  366. SELECT 'Waiter_Blocking_Report' AS [Information],
  367. -- blocked
  368. es.session_id AS blocked_spid,
  369. es.[status] AS [blocked_spid_status],
  370. ot.task_state AS [blocked_task_status],
  371. owt.wait_type AS blocked_spid_wait_type,
  372. COALESCE(owt.wait_duration_ms, DATEDIFF(ms, es.last_request_start_time, GETDATE())) AS blocked_spid_wait_time_ms,
  373. --er.total_elapsed_time AS blocked_elapsed_time_ms,
  374. /*
  375. Check sys.dm_os_waiting_tasks for Exchange wait types in http://technet.microsoft.com/en-us/library/ms188743.aspx.
  376. - Wait Resource e_waitPipeNewRow in CXPACKET waits – Producer waiting on consumer for a packet to fill.
  377. - Wait Resource e_waitPipeGetRow in CXPACKET waits – Consumer waiting on producer to fill a packet.
  378. */
  379. owt.resource_description AS blocked_spid_res_desc,
  380. owt.[objid] AS blocked_objectid,
  381. owt.pageid AS blocked_pageid,
  382. CASE WHEN owt.pageid = 1 OR owt.pageid % 8088 = 0 THEN 'Is_PFS_Page'
  383. WHEN owt.pageid = 2 OR owt.pageid % 511232 = 0 THEN 'Is_GAM_Page'
  384. WHEN owt.pageid = 3 OR (owt.pageid - 1) % 511232 = 0 THEN 'Is_SGAM_Page'
  385. WHEN owt.pageid IS NULL THEN NULL
  386. ELSE 'Is_not_PFS_GAM_SGAM_page' END AS blocked_spid_res_type,
  387. (SELECT qt.text AS [text()]
  388. FROM sys.dm_exec_sql_text(COALESCE(er.sql_handle, ec.most_recent_sql_handle)) AS qt
  389. FOR XML PATH(''), TYPE) AS [blocked_batch],
  390. (SELECT SUBSTRING(qt2.text,
  391. 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
  392. 1+(CASE WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er.statement_end_offset/2 END - (CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END))) AS [text()]
  393. FROM sys.dm_exec_sql_text(COALESCE(er.sql_handle, ec.most_recent_sql_handle)) AS qt2
  394. FOR XML PATH(''), TYPE) AS [blocked_statement],
  395. es.last_request_start_time AS blocked_last_start,
  396. LEFT (CASE COALESCE(es.transaction_isolation_level, er.transaction_isolation_level)
  397. WHEN 0 THEN '0-Unspecified'
  398. WHEN 1 THEN '1-ReadUncommitted(NOLOCK)'
  399. WHEN 2 THEN '2-ReadCommitted'
  400. WHEN 3 THEN '3-RepeatableRead'
  401. WHEN 4 THEN '4-Serializable'
  402. WHEN 5 THEN '5-Snapshot'
  403. ELSE CONVERT (VARCHAR(30), COALESCE(es.transaction_isolation_level, er.transaction_isolation_level)) + '-UNKNOWN'
  404. END, 30) AS blocked_tran_isolation_level,
  405. -- blocker
  406. er.blocking_session_id As blocker_spid,
  407. CASE
  408. -- session has an active request, is blocked, but is blocking others or session is idle but has an open tran and is blocking others
  409. WHEN (er2.session_id IS NULL OR owt.blocking_session_id IS NULL) AND (er.blocking_session_id = 0 OR er.session_id IS NULL) THEN 1
  410. -- session is either not blocking someone, or is blocking someone but is blocked by another party
  411. ELSE 0
  412. END AS is_head_blocker,
  413. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  414. qt2.text,
  415. NCHAR(0),N'?'),NCHAR(1),N'?'),NCHAR(2),N'?'),NCHAR(3),N'?'),NCHAR(4),N'?'),NCHAR(5),N'?'),NCHAR(6),N'?'),NCHAR(7),N'?'),NCHAR(8),N'?'),NCHAR(11),N'?'),NCHAR(12),N'?'),NCHAR(14),N'?'),NCHAR(15),N'?'),NCHAR(16),N'?'),NCHAR(17),N'?'),NCHAR(18),N'?'),NCHAR(19),N'?'),NCHAR(20),N'?'),NCHAR(21),N'?'),NCHAR(22),N'?'),NCHAR(23),N'?'),NCHAR(24),N'?'),NCHAR(25),N'?'),NCHAR(26),N'?'),NCHAR(27),N'?'),NCHAR(28),N'?'),NCHAR(29),N'?'),NCHAR(30),N'?'),NCHAR(31),N'?')
  416. AS [text()]
  417. FROM sys.dm_exec_sql_text(COALESCE(er2.sql_handle, ec2.most_recent_sql_handle)) AS qt2
  418. FOR XML PATH(''), TYPE) AS [blocker_batch],
  419. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  420. SUBSTRING(qt2.text,
  421. 1+(CASE WHEN er2.statement_start_offset = 0 THEN 0 ELSE er2.statement_start_offset/2 END),
  422. 1+(CASE WHEN er2.statement_end_offset = -1 THEN DATALENGTH(qt2.text) ELSE er2.statement_end_offset/2 END - (CASE WHEN er2.statement_start_offset = 0 THEN 0 ELSE er2.statement_start_offset/2 END))),
  423. NCHAR(0),N'?'),NCHAR(1),N'?'),NCHAR(2),N'?'),NCHAR(3),N'?'),NCHAR(4),N'?'),NCHAR(5),N'?'),NCHAR(6),N'?'),NCHAR(7),N'?'),NCHAR(8),N'?'),NCHAR(11),N'?'),NCHAR(12),N'?'),NCHAR(14),N'?'),NCHAR(15),N'?'),NCHAR(16),N'?'),NCHAR(17),N'?'),NCHAR(18),N'?'),NCHAR(19),N'?'),NCHAR(20),N'?'),NCHAR(21),N'?'),NCHAR(22),N'?'),NCHAR(23),N'?'),NCHAR(24),N'?'),NCHAR(25),N'?'),NCHAR(26),N'?'),NCHAR(27),N'?'),NCHAR(28),N'?'),NCHAR(29),N'?'),NCHAR(30),N'?'),NCHAR(31),N'?')
  424. AS [text()]
  425. FROM sys.dm_exec_sql_text(COALESCE(er2.sql_handle, ec2.most_recent_sql_handle)) AS qt2
  426. FOR XML PATH(''), TYPE) AS [blocker_statement],
  427. es2.last_request_start_time AS blocker_last_start,
  428. LEFT (CASE COALESCE(er2.transaction_isolation_level, es.transaction_isolation_level)
  429. WHEN 0 THEN '0-Unspecified'
  430. WHEN 1 THEN '1-ReadUncommitted(NOLOCK)'
  431. WHEN 2 THEN '2-ReadCommitted'
  432. WHEN 3 THEN '3-RepeatableRead'
  433. WHEN 4 THEN '4-Serializable'
  434. WHEN 5 THEN '5-Snapshot'
  435. ELSE CONVERT (VARCHAR(30), COALESCE(er2.transaction_isolation_level, es.transaction_isolation_level)) + '-UNKNOWN'
  436. END, 30) AS blocker_tran_isolation_level,
  437. -- blocked - other data
  438. DB_NAME(er.database_id) AS blocked_database,
  439. es.[host_name] AS blocked_host,
  440. es.[program_name] AS blocked_program,
  441. es.login_name AS blocked_login,
  442. CASE WHEN es.session_id = -2 THEN 'Orphaned_distributed_tran'
  443. WHEN es.session_id = -3 THEN 'Defered_recovery_tran'
  444. WHEN es.session_id = -4 THEN 'Unknown_tran' ELSE NULL END AS blocked_session_comment,
  445. es.is_user_process AS [blocked_is_user_process],
  446. -- blocker - other data
  447. DB_NAME(er2.database_id) AS blocker_database,
  448. es2.[host_name] AS blocker_host,
  449. es2.[program_name] AS blocker_program,
  450. es2.login_name AS blocker_login,
  451. CASE WHEN es2.session_id = -2 THEN 'Orphaned_distributed_tran'
  452. WHEN es2.session_id = -3 THEN 'Defered_recovery_tran'
  453. WHEN es2.session_id = -4 THEN 'Unknown_tran' ELSE NULL END AS blocker_session_comment,
  454. es2.is_user_process AS [blocker_is_user_process]
  455. FROM sys.dm_exec_sessions (NOLOCK) es
  456. LEFT OUTER JOIN sys.dm_exec_requests (NOLOCK) er ON es.session_id = er.session_id
  457. LEFT OUTER JOIN sys.dm_exec_connections (NOLOCK) ec ON es.session_id = ec.session_id
  458. LEFT OUTER JOIN sys.dm_os_tasks (NOLOCK) ot ON er.session_id = ot.session_id AND er.request_id = ot.request_id
  459. LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es2 ON er.blocking_session_id = es2.session_id
  460. LEFT OUTER JOIN sys.dm_exec_requests (NOLOCK) er2 ON es2.session_id = er2.session_id
  461. LEFT OUTER JOIN sys.dm_exec_connections (NOLOCK) ec2 ON es2.session_id = ec2.session_id
  462. LEFT OUTER JOIN
  463. (
  464. -- In some cases (e.g. parallel queries, also waiting for a worker), one thread can be flagged as
  465. -- waiting for several different threads. This will cause that thread to show up in multiple rows
  466. -- in our grid, which we don't want. Use ROW_NUMBER to select the longest wait for each thread,
  467. -- and use it as representative of the other wait relationships this thread is involved in.
  468. SELECT waiting_task_address, session_id, exec_context_id, wait_duration_ms,
  469. wait_type, resource_address, blocking_task_address, blocking_session_id,
  470. blocking_exec_context_id, resource_description,
  471. CASE WHEN [wait_type] LIKE 'PAGE%' AND [resource_description] LIKE '%:%' THEN CAST(RIGHT([resource_description], LEN([resource_description]) - CHARINDEX(':', [resource_description], LEN([resource_description])-CHARINDEX(':', REVERSE([resource_description])))) AS int)
  472. WHEN [wait_type] LIKE 'LCK%' AND [resource_description] LIKE '%pageid%' AND ISNUMERIC(RIGHT(LEFT([resource_description],CHARINDEX('dbid=', [resource_description], CHARINDEX('pageid=', [resource_description])+6)-1),CHARINDEX('=',REVERSE(RTRIM(LEFT([resource_description],CHARINDEX('dbid=', [resource_description], CHARINDEX('pageid=', [resource_description])+6)-1)))))) = 1 THEN CAST(RIGHT(LEFT([resource_description],CHARINDEX('dbid=', [resource_description], CHARINDEX('pageid=', [resource_description])+6)-1),CHARINDEX('=',REVERSE(RTRIM(LEFT([resource_description],CHARINDEX('dbid=', [resource_description], CHARINDEX('pageid=', [resource_description])+6)-1))))) AS bigint)
  473. ELSE NULL END AS pageid,
  474. CASE WHEN [wait_type] LIKE 'LCK%' AND [resource_description] LIKE '%associatedObjectId%' AND ISNUMERIC(RIGHT([resource_description],CHARINDEX('=', REVERSE([resource_description]))-1)) = 1 THEN CAST(RIGHT([resource_description],CHARINDEX('=', REVERSE([resource_description]))-1) AS bigint)
  475. ELSE NULL END AS [objid],
  476. ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num
  477. FROM sys.dm_os_waiting_tasks (NOLOCK)
  478. ) owt ON ot.task_address = owt.waiting_task_address AND owt.row_num = 1
  479. --OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) est
  480. --OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) eqp
  481. WHERE es.session_id <> @@SPID AND es.is_user_process = 1
  482. --AND ((owt.wait_duration_ms/1000 > 5) OR (er.total_elapsed_time/1000) > 5 OR er.total_elapsed_time IS NULL) --Only report blocks > 5 Seconds plus head blocker
  483. AND (es.session_id IN (SELECT er3.blocking_session_id FROM sys.dm_exec_requests (NOLOCK) er3) OR er.blocking_session_id IS NOT NULL OR er.blocking_session_id > 0)
  484. ORDER BY blocked_spid, is_head_blocker DESC, blocked_spid_wait_time_ms DESC, blocker_spid
  485. END;
  486. -- Query stats
  487. IF @qrystats = 1 AND @sqlmajorver >= 11
  488. BEGIN
  489. SELECT @sqlcmd = N'SELECT' + CASE WHEN @top IS NULL THEN '' ELSE ' TOP ' + CONVERT(NVARCHAR(10), @top) END + ' CASE WHEN CONVERT(int,pa.value) = 32767 THEN ''ResourceDB'' ELSE DB_NAME(CONVERT(int,pa.value)) END AS DatabaseName,
  490. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  491. st.text,
  492. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  493. AS [text()]
  494. FROM sys.dm_exec_sql_text(qs.sql_handle) AS st
  495. FOR XML PATH(''''), TYPE) AS [sqltext],
  496. qs.creation_time AS cached_time,
  497. qs.last_execution_time,
  498. qs.execution_count,
  499. qs.total_elapsed_time/qs.execution_count AS avg_elapsed_time,
  500. qs.last_elapsed_time,
  501. qs.total_worker_time/qs.execution_count AS avg_cpu_time,
  502. qs.last_worker_time AS last_cpu_time,
  503. qs.min_worker_time AS min_cpu_time, qs.max_worker_time AS max_cpu_time,
  504. qs.total_logical_reads/qs.execution_count AS avg_logical_reads,
  505. qs.last_logical_reads, qs.min_logical_reads, qs.max_logical_reads,
  506. qs.total_physical_reads/qs.execution_count AS avg_physical_reads,
  507. qs.last_physical_reads, qs.min_physical_reads, qs.max_physical_reads,
  508. qs.total_logical_writes/qs.execution_count AS avg_logical_writes,
  509. qs.last_logical_writes, qs.min_logical_writes, qs.max_logical_writes' + CASE WHEN @sqlmajorver >= 13 THEN ',
  510. CASE WHEN qs.total_grant_kb IS NOT NULL THEN qs.total_grant_kb/qs.execution_count ELSE -1 END AS avg_grant_kb,
  511. CASE WHEN qs.total_used_grant_kb IS NOT NULL THEN qs.total_used_grant_kb/qs.execution_count ELSE -1 END AS avg_used_grant_kb,
  512. COALESCE(((qs.total_used_grant_kb * 100.00) / NULLIF(qs.total_grant_kb,0)), 0) AS grant2used_ratio,
  513. CASE WHEN qs.total_ideal_grant_kb IS NOT NULL THEN qs.total_ideal_grant_kb/qs.execution_count ELSE -1 END AS avg_ideal_grant_kb,
  514. CASE WHEN qs.total_dop IS NOT NULL THEN qs.total_dop/qs.execution_count ELSE -1 END AS avg_dop,
  515. CASE WHEN qs.total_reserved_threads IS NOT NULL THEN qs.total_reserved_threads/qs.execution_count ELSE -1 END AS avg_reserved_threads,
  516. CASE WHEN qs.total_used_threads IS NOT NULL THEN qs.total_used_threads/qs.execution_count ELSE -1 END AS avg_used_threads' ELSE '' END +
  517. CASE WHEN @sqlmajorver >= 15 OR (@sqlmajorver = 13 AND @sqlbuild >= 5026) OR (@sqlmajorver = 14 AND @sqlbuild >= 3015) THEN ',
  518. CASE WHEN qs.total_columnstore_segment_reads IS NOT NULL THEN qs.total_columnstore_segment_reads/qs.execution_count ELSE -1 END AS avg_columnstore_segment_reads,
  519. CASE WHEN qs.total_columnstore_segment_skips IS NOT NULL THEN qs.total_columnstore_segment_skips/qs.execution_count ELSE -1 END AS avg_columnstore_segment_skips,
  520. CASE WHEN qs.total_spills IS NOT NULL THEN qs.total_spills/qs.execution_count ELSE -1 END AS avg_spills' ELSE '' END +'
  521. FROM sys.dm_exec_query_stats (NOLOCK) AS qs
  522. CROSS APPLY sys.dm_exec_plan_attributes(qs.plan_handle) AS pa
  523. WHERE pa.attribute = ''dbid'''
  524. EXEC (@sqlcmd);
  525. END;
  526. -- Stored procedure stats
  527. IF @spstats = 1 AND @sqlmajorver >= 11
  528. BEGIN
  529. SET @sqlcmd = N'SELECT' + CASE WHEN @top IS NULL THEN '' ELSE ' TOP ' + CONVERT(NVARCHAR(10), @top) END + ' CASE WHEN ps.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(ps.database_id) END AS DatabaseName,
  530. CASE WHEN ps.database_id = 32767 THEN NULL ELSE OBJECT_NAME(ps.[object_id], ps.database_id) END AS ObjectName,
  531. type_desc,
  532. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  533. qt.text,
  534. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  535. AS [text()]
  536. FROM sys.dm_exec_procedure_stats (NOLOCK) ps2 CROSS APPLY sys.dm_exec_sql_text(ps2.sql_handle) qt
  537. WHERE ps2.database_id = ps.database_id AND ps2.[object_id] = ps.[object_id]
  538. FOR XML PATH(''''), TYPE) AS [sqltext],
  539. qp.query_plan,
  540. ps.cached_time,
  541. ps.last_execution_time,
  542. ps.execution_count,
  543. ps.total_elapsed_time/ps.execution_count AS avg_elapsed_time,
  544. ps.last_elapsed_time,
  545. ps.total_worker_time/ps.execution_count AS avg_cpu_time,
  546. ps.last_worker_time AS last_cpu_time,
  547. ps.min_worker_time AS min_cpu_time, ps.max_worker_time AS max_cpu_time,
  548. ps.total_logical_reads/ps.execution_count AS avg_logical_reads,
  549. ps.last_logical_reads, ps.min_logical_reads, ps.max_logical_reads,
  550. ps.total_physical_reads/ps.execution_count AS avg_physical_reads,
  551. ps.last_physical_reads, ps.min_physical_reads, ps.max_physical_reads,
  552. ps.total_logical_writes/ps.execution_count AS avg_logical_writes,
  553. ps.last_logical_writes, ps.min_logical_writes, ps.max_logical_writes
  554. FROM sys.dm_exec_procedure_stats (NOLOCK) ps
  555. CROSS APPLY sys.dm_exec_query_plan(ps.plan_handle) qp'
  556. EXEC (@sqlcmd);
  557. END;
  558. -- Trigger stats
  559. IF @trstats = 1 AND @sqlmajorver >= 11
  560. BEGIN
  561. SET @sqlcmd = N'SELECT' + CASE WHEN @top IS NULL THEN '' ELSE ' TOP ' + CONVERT(NVARCHAR(10), @top) END + ' CASE WHEN ts.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(ts.database_id) END AS DatabaseName,
  562. CASE WHEN ts.database_id = 32767 THEN NULL ELSE OBJECT_NAME(ts.[object_id], ts.database_id) END AS ObjectName,
  563. type_desc,
  564. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  565. qt.text,
  566. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  567. AS [text()]
  568. FROM sys.dm_exec_trigger_stats (NOLOCK) ts2 CROSS APPLY sys.dm_exec_sql_text(ts2.sql_handle) qt
  569. WHERE ts2.database_id = ts.database_id AND ts2.[object_id] = ts.[object_id]
  570. FOR XML PATH(''''), TYPE) AS [sqltext],
  571. qp.query_plan,
  572. ts.cached_time,
  573. ts.last_execution_time,
  574. ts.execution_count,
  575. ts.total_elapsed_time/ts.execution_count AS avg_elapsed_time,
  576. ts.last_elapsed_time,
  577. ts.total_worker_time/ts.execution_count AS avg_cpu_time,
  578. ts.last_worker_time AS last_cpu_time,
  579. ts.min_worker_time AS min_cpu_time, ts.max_worker_time AS max_cpu_time,
  580. ts.total_logical_reads/ts.execution_count AS avg_logical_reads,
  581. ts.last_logical_reads, ts.min_logical_reads, ts.max_logical_reads,
  582. ts.total_physical_reads/ts.execution_count AS avg_physical_reads,
  583. ts.last_physical_reads, ts.min_physical_reads, ts.max_physical_reads,
  584. ts.total_logical_writes/ts.execution_count AS avg_logical_writes,
  585. ts.last_logical_writes, ts.min_logical_writes, ts.max_logical_writes
  586. FROM sys.dm_exec_trigger_stats (NOLOCK) ts
  587. CROSS APPLY sys.dm_exec_query_plan(ts.plan_handle) qp'
  588. EXEC (@sqlcmd);
  589. END;
  590. -- Function stats
  591. IF @fnstats = 1 AND @sqlmajorver >= 13
  592. BEGIN
  593. SET @sqlcmd = N'SELECT' + CASE WHEN @top IS NULL THEN '' ELSE ' TOP ' + CONVERT(NVARCHAR(10), @top) END + ' CASE WHEN fs.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(fs.database_id) END AS DatabaseName,
  594. CASE WHEN fs.database_id = 32767 THEN NULL ELSE OBJECT_NAME(fs.[object_id], fs.database_id) END AS ObjectName,
  595. type_desc,
  596. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  597. qt.text,
  598. NCHAR(0),N''?''),NCHAR(1),N''?''),NCHAR(2),N''?''),NCHAR(3),N''?''),NCHAR(4),N''?''),NCHAR(5),N''?''),NCHAR(6),N''?''),NCHAR(7),N''?''),NCHAR(8),N''?''),NCHAR(11),N''?''),NCHAR(12),N''?''),NCHAR(14),N''?''),NCHAR(15),N''?''),NCHAR(16),N''?''),NCHAR(17),N''?''),NCHAR(18),N''?''),NCHAR(19),N''?''),NCHAR(20),N''?''),NCHAR(21),N''?''),NCHAR(22),N''?''),NCHAR(23),N''?''),NCHAR(24),N''?''),NCHAR(25),N''?''),NCHAR(26),N''?''),NCHAR(27),N''?''),NCHAR(28),N''?''),NCHAR(29),N''?''),NCHAR(30),N''?''),NCHAR(31),N''?'')
  599. AS [text()]
  600. FROM sys.dm_exec_function_stats (NOLOCK) fs2 CROSS APPLY sys.dm_exec_sql_text(fs2.sql_handle) qt
  601. WHERE fs2.database_id = fs.database_id AND fs2.[object_id] = fs.[object_id]
  602. FOR XML PATH(''''), TYPE) AS [sqltext],
  603. qp.query_plan,
  604. fs.cached_time,
  605. fs.last_execution_time,
  606. fs.execution_count,
  607. fs.total_elapsed_time/fs.execution_count AS avg_elapsed_time,
  608. fs.last_elapsed_time,
  609. fs.total_worker_time/fs.execution_count AS avg_cpu_time,
  610. fs.last_worker_time AS last_cpu_time,
  611. fs.min_worker_time AS min_cpu_time, fs.max_worker_time AS max_cpu_time,
  612. fs.total_logical_reads/fs.execution_count AS avg_logical_reads,
  613. fs.last_logical_reads, fs.min_logical_reads, fs.max_logical_reads,
  614. fs.total_physical_reads/fs.execution_count AS avg_physical_reads,
  615. fs.last_physical_reads, fs.min_physical_reads, fs.max_physical_reads,
  616. fs.total_logical_writes/fs.execution_count AS avg_logical_writes,
  617. fs.last_logical_writes, fs.min_logical_writes, fs.max_logical_writes
  618. FROM sys.dm_exec_function_stats (NOLOCK) fs
  619. CROSS APPLY sys.dm_exec_query_plan(fs.plan_handle) qp'
  620. EXEC (@sqlcmd);
  621. END;