|
|
@@ -1,4 +1,4 @@
|
|
|
--- 2012-04-07 Pedro Lopes (Microsoft) [email protected] (http://aka.ms/sqlinsights/)
|
|
|
+-- 2012-04-07 Pedro Lopes (Microsoft) (http://aka.ms/tigertoolbox/)
|
|
|
--
|
|
|
-- Returns running sessions/requests; blocking information; sessions that have been granted locks or waiting for locks; SPs stats.
|
|
|
--
|
|
|
@@ -16,8 +16,9 @@
|
|
|
-- 12/2/2016 Fixed transport-level error issue with SQL Server 2016 SP1.
|
|
|
-- 2/16/2016 Added NOLOCK hints.
|
|
|
-- 3/28/2017 Fixed missing characters in offset fetches.
|
|
|
--- 10/11/2017 Commented out Stored procedure stats section to optimize for in-flight requests.
|
|
|
--- 10/20/2017 Added Query stats section.
|
|
|
+-- 10/11/2017 Commented out stored procedure/query stats section to optimize for in-flight requests.
|
|
|
+-- 10/20/2017 Added Query stats section and support for sys.dm_exec_query_statistics_xml.
|
|
|
+-- 04/02/2019 Added support for sys.dm_exec_query_plan_stats and trigger/function stats section.
|
|
|
|
|
|
|
|
|
/*
|
|
|
@@ -207,7 +208,7 @@ FROM sys.dm_exec_requests (NOLOCK) er
|
|
|
WHERE er.session_id <> @@SPID AND es.is_user_process = 1
|
|
|
ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
|
|
|
END
|
|
|
-ELSE IF (@sqlmajorver = 13 AND @sqlbuild > 4000) OR @sqlmajorver > 13
|
|
|
+ELSE IF (@sqlmajorver = 13 AND @sqlbuild > 4000) OR @sqlmajorver = 14 OR (@sqlmajorver = 15 AND @sqlbuild < 1400)
|
|
|
BEGIN
|
|
|
SELECT @sqlcmd = N'WITH tsu AS (SELECT session_id, SUM(user_objects_alloc_page_count) AS user_objects_alloc_page_count,
|
|
|
SUM(user_objects_dealloc_page_count) AS user_objects_dealloc_page_count,
|
|
|
@@ -293,6 +294,87 @@ FROM sys.dm_exec_requests (NOLOCK) er
|
|
|
WHERE er.session_id <> @@SPID AND es.is_user_process = 1
|
|
|
ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
|
|
|
END
|
|
|
+ELSE IF (@sqlmajorver = 15 AND @sqlbuild >= 1400) OR @sqlmajorver > 15
|
|
|
+BEGIN
|
|
|
+ SELECT @sqlcmd = N'WITH tsu AS (SELECT session_id, SUM(user_objects_alloc_page_count) AS user_objects_alloc_page_count,
|
|
|
+SUM(user_objects_dealloc_page_count) AS user_objects_dealloc_page_count,
|
|
|
+SUM(internal_objects_alloc_page_count) AS internal_objects_alloc_page_count,
|
|
|
+SUM(internal_objects_dealloc_page_count) AS internal_objects_dealloc_page_count FROM sys.dm_db_task_space_usage (NOLOCK) GROUP BY session_id)
|
|
|
+SELECT ''Requests'' AS [Information], es.session_id, DB_NAME(er.database_id) AS [database_name], OBJECT_NAME(qp.objectid, qp.dbid) AS [object_name],
|
|
|
+ (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(
|
|
|
+ qt.text,
|
|
|
+ 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''?'')
|
|
|
+ AS [text()]
|
|
|
+ FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
|
|
|
+ FOR XML PATH(''''), TYPE) AS [running_batch],
|
|
|
+ (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(
|
|
|
+ SUBSTRING(qt2.text,
|
|
|
+ 1+(CASE WHEN er.statement_start_offset = 0 THEN 0 ELSE er.statement_start_offset/2 END),
|
|
|
+ 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))),
|
|
|
+ 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''?'')
|
|
|
+ AS [text()]
|
|
|
+ FROM sys.dm_exec_sql_text(er.sql_handle) AS qt2
|
|
|
+ FOR XML PATH(''''), TYPE) AS [running_statement],
|
|
|
+ --ot.task_state AS [status],
|
|
|
+ er.status,
|
|
|
+ --er.command,
|
|
|
+ qp.query_plan,
|
|
|
+ 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],
|
|
|
+ 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],
|
|
|
+ er.percent_complete,
|
|
|
+ CONVERT(VARCHAR(20),DATEADD(ms,er.estimated_completion_time,GETDATE()),20) AS [ETA_completion_time],
|
|
|
+ (er.cpu_time/1000) AS cpu_time_sec,
|
|
|
+ (er.reads*8)/1024 AS physical_reads_KB,
|
|
|
+ (er.logical_reads*8)/1024 AS logical_reads_KB,
|
|
|
+ (er.writes*8)/1024 AS writes_KB,
|
|
|
+ (er.total_elapsed_time/1000)/60 AS elapsed_minutes,
|
|
|
+ er.wait_type,
|
|
|
+ er.wait_resource,
|
|
|
+ er.last_wait_type,
|
|
|
+ pi.page_type_desc AS wait_resource_type,
|
|
|
+ er.wait_time AS wait_time_ms,
|
|
|
+ er.cpu_time AS cpu_time_ms,
|
|
|
+ er.open_transaction_count,
|
|
|
+ DATEADD(s, (er.estimated_completion_time/1000), GETDATE()) AS estimated_completion_time,
|
|
|
+ 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],
|
|
|
+ LEFT (CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
|
|
|
+ WHEN 0 THEN ''0-Unspecified''
|
|
|
+ WHEN 1 THEN ''1-ReadUncommitted''
|
|
|
+ WHEN 2 THEN ''2-ReadCommitted''
|
|
|
+ WHEN 3 THEN ''3-RepeatableRead''
|
|
|
+ WHEN 4 THEN ''4-Serializable''
|
|
|
+ WHEN 5 THEN ''5-Snapshot''
|
|
|
+ ELSE CONVERT (VARCHAR(30), er.transaction_isolation_level) + ''-UNKNOWN''
|
|
|
+ END, 30) AS transaction_isolation_level,
|
|
|
+ mg.requested_memory_kb,
|
|
|
+ mg.granted_memory_kb,
|
|
|
+ mg.ideal_memory_kb,
|
|
|
+ mg.query_cost,
|
|
|
+ ((((ssu.user_objects_alloc_page_count + tsu.user_objects_alloc_page_count) -
|
|
|
+ (ssu.user_objects_dealloc_page_count + tsu.user_objects_dealloc_page_count))*8)/1024) AS user_obj_in_tempdb_MB,
|
|
|
+ ((((ssu.internal_objects_alloc_page_count + tsu.internal_objects_alloc_page_count) -
|
|
|
+ (ssu.internal_objects_dealloc_page_count + tsu.internal_objects_dealloc_page_count))*8)/1024) AS internal_obj_in_tempdb_MB,
|
|
|
+ es.[host_name],
|
|
|
+ es.login_name,
|
|
|
+ --es.original_login_name,
|
|
|
+ es.[program_name],
|
|
|
+ --ec.client_net_address,
|
|
|
+ es.is_user_process,
|
|
|
+ g.name AS workload_group
|
|
|
+FROM sys.dm_exec_requests (NOLOCK) er
|
|
|
+ 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
|
|
|
+ LEFT OUTER JOIN sys.dm_db_session_space_usage (NOLOCK) ssu ON er.session_id = ssu.session_id
|
|
|
+ LEFT OUTER JOIN sys.dm_exec_sessions (NOLOCK) es ON er.session_id = es.session_id
|
|
|
+ LEFT OUTER JOIN tsu ON tsu.session_id = ssu.session_id
|
|
|
+ LEFT OUTER JOIN sys.dm_resource_governor_workload_groups (NOLOCK) g ON es.group_id = g.group_id
|
|
|
+ OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp
|
|
|
+ OUTER APPLY sys.dm_exec_query_statistics_xml(er.session_id) qes
|
|
|
+ OUTER APPLY sys.dm_exec_query_plan_stats(er.plan_handle) qps
|
|
|
+ OUTER APPLY sys.fn_PageResCracker(er.page_resource) pc
|
|
|
+ OUTER APPLY sys.dm_db_page_info(pc.db_id, pc.file_id, pc.page_id, ''LIMITED'') pi
|
|
|
+WHERE er.session_id <> @@SPID AND es.is_user_process = 1
|
|
|
+ORDER BY er.total_elapsed_time DESC, er.logical_reads DESC, [database_name], session_id'
|
|
|
+END
|
|
|
--PRINT @sqlcmd
|
|
|
EXECUTE (@sqlcmd)
|
|
|
GO
|
|
|
@@ -428,7 +510,7 @@ SELECT @sqlmajorver = CONVERT(int, (@@microsoftversion / 0x1000000) & 0xff);
|
|
|
|
|
|
IF @sqlmajorver >= 11
|
|
|
BEGIN
|
|
|
- SET @sqlcmd = N'SELECT ''Sproc_Stats_Report'' AS [Information], CASE WHEN ps.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(ps.database_id) END AS DatabaseName,
|
|
|
+ SET @sqlcmd = N'SELECT CASE WHEN ps.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(ps.database_id) END AS DatabaseName,
|
|
|
CASE WHEN ps.database_id = 32767 THEN NULL ELSE OBJECT_NAME(ps.[object_id], ps.database_id) END AS ObjectName,
|
|
|
type_desc,
|
|
|
(SELECT qt.text AS [text()]
|
|
|
@@ -479,6 +561,66 @@ CROSS APPLY sys.dm_exec_plan_attributes(qs.plan_handle) AS pa
|
|
|
WHERE pa.attribute = ''dbid'''
|
|
|
EXEC (@sqlcmd);
|
|
|
END
|
|
|
+
|
|
|
+-- Trigger stats
|
|
|
+IF @sqlmajorver >= 11
|
|
|
+BEGIN
|
|
|
+ SET @sqlcmd = N'SELECT CASE WHEN ts.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(ts.database_id) END AS DatabaseName,
|
|
|
+ CASE WHEN ts.database_id = 32767 THEN NULL ELSE OBJECT_NAME(ts.[object_id], ts.database_id) END AS ObjectName,
|
|
|
+ type_desc,
|
|
|
+ (SELECT qt.text AS [text()]
|
|
|
+ FROM sys.dm_exec_trigger_stats (NOLOCK) ts2 CROSS APPLY sys.dm_exec_sql_text(ts2.sql_handle) qt
|
|
|
+ WHERE ts2.database_id = ts.database_id AND ts2.[object_id] = ts.[object_id]
|
|
|
+ FOR XML PATH(''''), TYPE) AS [sqltext],
|
|
|
+ qp.query_plan,
|
|
|
+ ts.cached_time,
|
|
|
+ ts.last_execution_time,
|
|
|
+ ts.execution_count,
|
|
|
+ ts.total_elapsed_time/ts.execution_count AS avg_elapsed_time,
|
|
|
+ ts.last_elapsed_time,
|
|
|
+ ts.total_worker_time/ts.execution_count AS avg_cpu_time,
|
|
|
+ ts.last_worker_time AS last_cpu_time,
|
|
|
+ ts.min_worker_time AS min_cpu_time, ts.max_worker_time AS max_cpu_time,
|
|
|
+ ts.total_logical_reads/ts.execution_count AS avg_logical_reads,
|
|
|
+ ts.last_logical_reads, ts.min_logical_reads, ts.max_logical_reads,
|
|
|
+ ts.total_physical_reads/ts.execution_count AS avg_physical_reads,
|
|
|
+ ts.last_physical_reads, ts.min_physical_reads, ts.max_physical_reads,
|
|
|
+ ts.total_logical_writes/ts.execution_count AS avg_logical_writes,
|
|
|
+ ts.last_logical_writes, ts.min_logical_writes, ts.max_logical_writes
|
|
|
+ FROM sys.dm_exec_trigger_stats (NOLOCK) ts
|
|
|
+ CROSS APPLY sys.dm_exec_query_plan(ts.plan_handle) qp'
|
|
|
+ EXEC (@sqlcmd);
|
|
|
+END
|
|
|
+
|
|
|
+-- Function stats
|
|
|
+IF @sqlmajorver >= 11
|
|
|
+BEGIN
|
|
|
+ SET @sqlcmd = N'SELECT CASE WHEN fs.database_id = 32767 THEN ''ResourceDB'' ELSE DB_NAME(fs.database_id) END AS DatabaseName,
|
|
|
+ CASE WHEN fs.database_id = 32767 THEN NULL ELSE OBJECT_NAME(fs.[object_id], fs.database_id) END AS ObjectName,
|
|
|
+ type_desc,
|
|
|
+ (SELECT qt.text AS [text()]
|
|
|
+ FROM sys.dm_exec_function_stats (NOLOCK) fs2 CROSS APPLY sys.dm_exec_sql_text(ts2.sql_handle) qt
|
|
|
+ WHERE fs2.database_id = fs.database_id AND fs2.[object_id] = fs.[object_id]
|
|
|
+ FOR XML PATH(''''), TYPE) AS [sqltext],
|
|
|
+ qp.query_plan,
|
|
|
+ fs.cached_time,
|
|
|
+ fs.last_execution_time,
|
|
|
+ fs.execution_count,
|
|
|
+ fs.total_elapsed_time/fs.execution_count AS avg_elapsed_time,
|
|
|
+ fs.last_elapsed_time,
|
|
|
+ fs.total_worker_time/fs.execution_count AS avg_cpu_time,
|
|
|
+ fs.last_worker_time AS last_cpu_time,
|
|
|
+ fs.min_worker_time AS min_cpu_time, fs.max_worker_time AS max_cpu_time,
|
|
|
+ fs.total_logical_reads/fs.execution_count AS avg_logical_reads,
|
|
|
+ fs.last_logical_reads, fs.min_logical_reads, fs.max_logical_reads,
|
|
|
+ fs.total_physical_reads/fs.execution_count AS avg_physical_reads,
|
|
|
+ fs.last_physical_reads, fs.min_physical_reads, fs.max_physical_reads,
|
|
|
+ fs.total_logical_writes/fs.execution_count AS avg_logical_writes,
|
|
|
+ fs.last_logical_writes, fs.min_logical_writes, fs.max_logical_writes
|
|
|
+ FROM sys.dm_exec_function_stats (NOLOCK) fs
|
|
|
+ CROSS APPLY sys.dm_exec_query_plan(fs.plan_handle) qp'
|
|
|
+ EXEC (@sqlcmd);
|
|
|
+END
|
|
|
*/
|
|
|
|
|
|
/*
|