Browse Source

Added support for sys.dm_exec_query_plan_stats and trigger/function stats section

Added support for sys.dm_exec_query_plan_stats and trigger/function stats section
pmasl 6 years ago
parent
commit
0a2599844e

File diff suppressed because it is too large
+ 1 - 1
Running-Blocked-Processes/Running-Blocked-Processes.ipynb


+ 147 - 5
Running-Blocked-Processes/view_Running_Blocked_processes.sql

@@ -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
 */
 
 /*

Some files were not shown because too many files changed in this diff