diff --git a/NexusReports/System_Requests_C.rdl b/NexusReports/System_Requests_C.rdl index 33b7fd7..99606c5 100644 --- a/NexusReports/System_Requests_C.rdl +++ b/NexusReports/System_Requests_C.rdl @@ -1,11 +1,22 @@  - + + + + SSDTRS + 17.14.37027.9 + + + SSDTRS + 17.14.37027.9 + + 2026-03-26T14:14:49.5677110Z + 0 SQL - ="data source=" & Parameters!dsServerName.Value & ";initial catalog="&Parameters!dsDatabaseName.Value + Data Source=.;Initial Catalog=sqlnexus true Integrated @@ -16,27 +27,29 @@ DataSource1 - IF OBJECT_ID('tbl_System_Requests') IS NOT NULL -BEGIN - SELECT DISTINCT - CAST(runtime AS DATETIME2(3)) Runtime - FROM dbo.tbl_System_Requests - ORDER BY Runtime; + + IF OBJECT_ID('tbl_System_Requests') IS NOT NULL + BEGIN + SELECT DISTINCT + CAST(runtime AS DATETIME2(3)) Runtime + FROM dbo.tbl_System_Requests + ORDER BY Runtime; -END; -ELSE -BEGIN + END; + ELSE + BEGIN - SELECT * - FROM - ( - SELECT CAST('1990/1/1' AS DATETIME) AS Runtime - UNION - SELECT CAST('9999/12/31' AS DATETIME) AS Runtime - ) t - ORDER BY Runtime; + SELECT * + FROM + ( + SELECT CAST('1990/1/1' AS DATETIME) AS Runtime + UNION + SELECT CAST('9999/12/31' AS DATETIME) AS Runtime + ) t + ORDER BY Runtime; -END; + END; + @@ -48,17 +61,19 @@ END; DataSource1 - IF OBJECT_ID('tbl_System_Requests') IS NOT NULL -BEGIN - SELECT CAST(MIN(runtime) AS DATETIME2(3)) StartTime - FROM dbo.tbl_System_Requests; + + IF OBJECT_ID('tbl_System_Requests') IS NOT NULL + BEGIN + SELECT CAST(MIN(runtime) AS DATETIME2(3)) StartTime + FROM dbo.tbl_System_Requests; -END; -ELSE -BEGIN - SELECT CAST('1990/1/1' AS DATETIME) AS StartTime; + END; + ELSE + BEGIN + SELECT CAST('1990/1/1' AS DATETIME) AS StartTime; -END; + END; + @@ -70,17 +85,19 @@ END; DataSource1 - IF OBJECT_ID('tbl_System_Requests') IS NOT NULL -BEGIN - SELECT CAST(MAX(runtime) AS DATETIME2(3)) EndTime - FROM dbo.tbl_System_Requests; + + IF OBJECT_ID('tbl_System_Requests') IS NOT NULL + BEGIN + SELECT CAST(MAX(runtime) AS DATETIME2(3)) EndTime + FROM dbo.tbl_System_Requests; -END; -ELSE -BEGIN - SELECT CAST('9999/12/31' AS DATETIME) AS EndTime; + END; + ELSE + BEGIN + SELECT CAST('9999/12/31' AS DATETIME) AS EndTime; -END; + END; + @@ -103,64 +120,81 @@ END; =Parameters!PercentThreshold.Value - --declare @PercentThreshold float = 10 ---declare @StartTime datetime = '1900-01-01' ---declare @EndTime datetime = '9999-12-31' -DECLARE @tmp TABLE -( - runtime DATETIME, - os_thread_id INT, - command NVARCHAR(128), - cpu_time FLOAT, - prev_cpu_time FLOAT, - prev_runtime DATETIME + -- Get CPU core count for normalization +DECLARE @CoreCount INT = 1; +SELECT @CoreCount = COALESCE( + (SELECT CAST(PropertyValue AS INT) FROM [dbo].[tbl_ServerProperties] WHERE PropertyName = 'cpu_count'), + (SELECT MAX(cpu_count) FROM [dbo].[tbl_dm_os_sys_info]), + 1 ); -INSERT INTO @tmp -SELECT runtime, - os_thread_id, - command, - cpu_time, - LAG(cpu_time, 1, 0) OVER (PARTITION BY os_thread_id, command ORDER BY runtime) AS prev_cpu_time, - LAG(runtime, 1, 0) OVER (PARTITION BY os_thread_id, command ORDER BY runtime) AS prev_runtime -FROM dbo.tbl_System_Requests; +-- Boundary: treat "uninitialized / bogus" prev_runtime as invalid +DECLARE @MinPrevRuntime datetime2(0) = '2000-01-01T00:00:00'; + +;WITH src AS +( + SELECT + r.runtime, + r.os_thread_id, + r.command, + r.cpu_time, + LAG(r.cpu_time) OVER (PARTITION BY r.os_thread_id, r.command ORDER BY r.runtime) AS prev_cpu_time, + LAG(r.runtime) OVER (PARTITION BY r.os_thread_id, r.command ORDER BY r.runtime) AS prev_runtime + FROM dbo.tbl_System_Requests AS r +), +calc AS +( + SELECT + runtime, + os_thread_id, + command, + cpu_time, + prev_cpu_time, + prev_runtime, + (cpu_time - prev_cpu_time) AS delta_cpu, + + CASE + WHEN prev_runtime IS NULL + OR prev_runtime < @MinPrevRuntime + OR runtime < prev_runtime + THEN NULL + ELSE DATEDIFF_BIG(ms, prev_runtime, runtime) + END AS elapsed_ms + FROM src +) +SELECT TOP (10) + c.runtime, + c.command, + c.os_thread_id, + c.delta_cpu AS delta, + c.elapsed_ms AS delta_elapse_time, -SELECT TOP 10 - runtime, - t1.command, - t1.os_thread_id, - (cpu_time - prev_cpu_time) delta, - DATEDIFF(ms, prev_runtime, runtime) delta_elapse_time, - (cpu_time - prev_cpu_time) * 100.0 / CASE - WHEN DATEDIFF(ms, prev_runtime, runtime) = 0 THEN - NULL - ELSE - DATEDIFF(ms, prev_runtime, runtime) - END cpu_percent -FROM @tmp t1 ---join (select distinct command, os_thread_id from @tmp where prev_cpu_time >0 and (cpu_time-prev_cpu_time) * 100.0/datediff (ms, prev_runtime, runtime) > @PercentThreshold) t on t1.command=t.command and t1.os_thread_id = t.os_thread_id -WHERE prev_cpu_time > 0 - AND runtime - BETWEEN @StartTime AND @EndTime - AND command IN - ( - SELECT command - FROM @tmp - WHERE prev_cpu_time > 0 - AND runtime - BETWEEN @StartTime AND @EndTime - GROUP BY command, - runtime - HAVING SUM(cpu_time - prev_cpu_time) * 100.00 - / (CASE - WHEN AVG(DATEDIFF(ms, prev_runtime, runtime)) = 0 THEN - NULL - ELSE - AVG(DATEDIFF(ms, prev_runtime, runtime)) - END - ) > @PercentThreshold - ) -ORDER BY 4 DESC; + -- Normalize CPU percentage by dividing by elapsed time and core count + c.delta_cpu * 100.0 + / NULLIF(CONVERT(float, c.elapsed_ms), 0) + / NULLIF(@CoreCount, 0) AS cpu_percent, + + @CoreCount AS core_count +FROM calc AS c +WHERE + c.prev_cpu_time > 0 + AND c.runtime BETWEEN @StartTime AND @EndTime + AND c.elapsed_ms > 0 + AND c.command IN + ( + SELECT c2.command + FROM calc AS c2 + WHERE + c2.prev_cpu_time > 0 + AND c2.runtime BETWEEN @StartTime AND @EndTime + AND c2.elapsed_ms > 0 + GROUP BY c2.command, c2.runtime + HAVING + SUM(c2.delta_cpu) * 100.0 + / NULLIF(AVG(CONVERT(float, c2.elapsed_ms)), 0) + / NULLIF(@CoreCount, 0) > @PercentThreshold + ) +ORDER BY c.delta_cpu DESC; @@ -173,20 +207,24 @@ ORDER BY 4 DESC; os_thread_id - System.Int32 + System.Int64 delta - System.Double + System.Int64 delta_elapse_time - System.Int32 + System.Int64 cpu_percent System.Double + + core_count + System.Int32 + @@ -214,7 +252,7 @@ ORDER BY 4 DESC; - cpu utilization percent + cpu utilization percent (normalized) @@ -300,7 +338,7 @@ ORDER BY 4 DESC; @@ -341,7 +379,7 @@ ORDER BY 4 DESC; @@ -990,10 +1028,10 @@ ORDER BY 4 DESC; Tahoma 8pt - #,0;(#,0) + #,0.00;(#,0.00) - CPU % over Elapse Time + CPU % (Normalized by Core Count) + + + + + + Textbox35 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!core_count.Value, "DataSet_System_Threads_Stats") + + + + + + + Textbox36 + + + 2pt + 2pt + 2pt + 2pt + + + + + + @@ -1448,12 +1559,13 @@ ORDER BY 4 DESC; + DataSet_StartTime 0.36333in 8.61681in - 0.75in + 1in 4.43527in 3 @@ -300,7 +338,7 @@ ORDER BY 4 DESC; @@ -341,7 +379,7 @@ ORDER BY 4 DESC; @@ -990,10 +1028,10 @@ ORDER BY 4 DESC; Tahoma 8pt - #,0;(#,0) + #,0.00;(#,0.00) - CPU % over Elapse Time + CPU % (Normalized by Core Count) + + + + + + Textbox35 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!core_count.Value, "DataSet_System_Threads_Stats") + + + + + + + Textbox36 + + + 2pt + 2pt + 2pt + 2pt + + + + + + @@ -1448,12 +1559,13 @@ ORDER BY 4 DESC; + DataSet_StartTime 0.36333in 8.61681in - 0.75in + 1in 4.43527in 3