From 4ffcb0656b9dc0ceca52856918979c99ac1b9aa0 Mon Sep 17 00:00:00 2001 From: JosephPilov-MSFT <23519517+PiJoCoder@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:07:23 -0500 Subject: [PATCH 1/5] #488 fix various places in PerfStatsAnalysis.sql - minor issues --- sqlnexus/PerfStatsAnalysis.sql | 57 ++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/sqlnexus/PerfStatsAnalysis.sql b/sqlnexus/PerfStatsAnalysis.sql index 8b03df21..983707a5 100644 --- a/sqlnexus/PerfStatsAnalysis.sql +++ b/sqlnexus/PerfStatsAnalysis.sql @@ -1133,13 +1133,24 @@ SELECT w_end.wait_category, END ) END AS total_wait_time_ms, + CASE + WHEN (CONVERT(BIGINT, w_end.wait_time_ms) - CASE + WHEN w_start.wait_time_ms IS NULL THEN + 0 + ELSE + w_start.wait_time_ms + END + ) <= 0 THEN + 0 + ELSE (CONVERT(BIGINT, w_end.wait_time_ms) - CASE WHEN w_start.wait_time_ms IS NULL THEN 0 ELSE w_start.wait_time_ms END - ) / (DATEDIFF(s, @StartTime, @EndTime) + 1) AS wait_time_ms_per_sec + ) / (DATEDIFF(s, @StartTime, @EndTime) + 1) + END AS wait_time_ms_per_sec INTO #waitstats_categories FROM dbo.vw_WAIT_CATEGORY_STATS w_end LEFT OUTER JOIN dbo.vw_WAIT_CATEGORY_STATS w_start @@ -1160,7 +1171,7 @@ ORDER BY (w_end.wait_time_ms - CASE ) DESC; -- Get number of available "CPU seconds" in the specified interval (seconds in collection interval times # CPUs on the system) -DECLARE @avail_cpu_time_sec INT; +DECLARE @avail_cpu_time_sec BIGINT; SELECT @avail_cpu_time_sec = ( SELECT TOP 1 [PropertyValue] FROM [dbo].[tbl_ServerProperties] WHERE PropertyName = 'cpu_count' @@ -1252,8 +1263,13 @@ FROM AND cat.wait_category NOT IN ( SELECT TOP 5 - cat.wait_category - FROM #waitstats_categories cat + cat2.wait_category + FROM #waitstats_categories cat2 + WHERE ( + cat2.wait_time_ms_per_sec > 0 + OR cat2.total_wait_time_ms > 0 + ) + AND cat2.wait_category != 'SOS_SCHEDULER_YIELD' ORDER BY wait_time_ms_per_sec DESC ) ) AS t @@ -1262,8 +1278,9 @@ ORDER BY wait_time_ms_per_sec DESC; GO - - +IF OBJECT_ID('DataSet_WaitStats_WaitStatsTopCategoriesOther') IS NOT NULL + DROP PROC DataSet_WaitStats_WaitStatsTopCategoriesOther; +GO CREATE PROC DataSet_WaitStats_WaitStatsTopCategoriesOther @StartTime DATETIME = '19000101', @EndTime DATETIME = '29990101', @@ -1324,7 +1341,7 @@ ORDER BY (w_end.wait_time_ms - CASE ) DESC; -- Get number of available "CPU seconds" in the specified interval (seconds in collection interval times # CPUs on the system) -DECLARE @avail_cpu_time_sec INT; +DECLARE @avail_cpu_time_sec BIGINT; SELECT @avail_cpu_time_sec = ( SELECT TOP 1 [PropertyValue] FROM [dbo].[tbl_ServerProperties] WHERE PropertyName = 'cpu_count' @@ -1412,8 +1429,13 @@ WHERE ( AND cat.wait_category NOT IN ( SELECT TOP 5 - cat.wait_category - FROM #waitstats_categories cat + cat2.wait_category + FROM #waitstats_categories cat2 + WHERE ( + cat2.wait_time_ms_per_sec > 0 + OR cat2.total_wait_time_ms > 0 + ) + AND cat2.wait_category != 'SOS_SCHEDULER_YIELD' ORDER BY wait_time_ms_per_sec DESC ) AND cat.wait_category != 'SOS_SCHEDULER_YIELD' @@ -1443,12 +1465,8 @@ IF @EndTime IS NULL SELECT * FROM dbo.vw_BLOCKING_CHAINS WHERE blocking_duration_sec > 0 - AND (blocking_start - BETWEEN @StartTime AND @EndTime - ) - OR (blocking_end - BETWEEN @StartTime AND @EndTime - ); + AND (blocking_start BETWEEN @StartTime AND @EndTime + OR blocking_end BETWEEN @StartTime AND @EndTime); GO SELECT CONVERT(VARCHAR, GETDATE(), 126); @@ -1548,7 +1566,7 @@ INTO @runtime, @blocked_tasks, @command, @query; -WHILE (@@FETCH_STATUS <> -1) +WHILE (@@FETCH_STATUS = 0) BEGIN SET @txtout = @txtout + ' ' + @runtime + @task_state + @wait_category + @wait_duration_ms + @request_elapsed_time @@ -4836,7 +4854,7 @@ BEGIN ( SELECT * FROM dbo.tbl_dm_db_stats_properties - WHERE (rows_sampled * 100.00) / [rows] < 5.0 + WHERE (rows_sampled * 100.00) / NULLIF([rows], 0) < 5.0 ) BEGIN UPDATE dbo.tbl_AnalysisSummary @@ -4855,7 +4873,7 @@ DECLARE @FileName NVARCHAR(MAX), @SqlStmt VARCHAR(MAX); --if xml_plan column is in the table, the the file name (only) of the file that contains the query plan with optimized batch sort -IF (COL_LENGTH('dbo.tblTopSqlPlan', 'xml_plan') IS NULL) +IF (COL_LENGTH('dbo.tblTopSqlPlan', 'xml_plan') IS NOT NULL) BEGIN SELECT TOP 1 @FileName = RIGHT([FileName], CHARINDEX('\', REVERSE([FileName])) - 1), @@ -5256,8 +5274,7 @@ BEGIN UPDATE dbo.tbl_SysDatabases SET is_auto_update_stats_on = 0 WHERE name = 'notexist'; - SELECT * - FROM dbo.tbl_AnalysisSummary; + IF EXISTS ( SELECT * From 9378fadd1d675b11ba81b1c0bfb10c7c5b7c756a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Apr 2026 00:39:48 +0000 Subject: [PATCH 2/5] Fix divide-by-zero in wait_time_ms_per_sec using NULLIF Agent-Logs-Url: https://github.com/microsoft/SqlNexus/sessions/4bf32a8d-734c-42b4-98c1-d14f2f6ad6e8 Co-authored-by: PiJoCoder <23519517+PiJoCoder@users.noreply.github.com> --- sqlnexus/PerfStatsAnalysis.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlnexus/PerfStatsAnalysis.sql b/sqlnexus/PerfStatsAnalysis.sql index 983707a5..cbe3bddc 100644 --- a/sqlnexus/PerfStatsAnalysis.sql +++ b/sqlnexus/PerfStatsAnalysis.sql @@ -1149,7 +1149,7 @@ SELECT w_end.wait_category, ELSE w_start.wait_time_ms END - ) / (DATEDIFF(s, @StartTime, @EndTime) + 1) + ) / NULLIF(DATEDIFF(s, @StartTime, @EndTime) + 1, 0) END AS wait_time_ms_per_sec INTO #waitstats_categories FROM dbo.vw_WAIT_CATEGORY_STATS w_end From 9e57bde24090bda4b9432dda20145926b87e9fa8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Apr 2026 00:41:21 +0000 Subject: [PATCH 3/5] Update usp_SmallSampledStats description to use NULLIF([rows], 0) Agent-Logs-Url: https://github.com/microsoft/SqlNexus/sessions/20c9b77f-b44d-41f2-8830-d9fcd5ddc2e5 Co-authored-by: PiJoCoder <23519517+PiJoCoder@users.noreply.github.com> --- sqlnexus/PerfStatsAnalysis.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlnexus/PerfStatsAnalysis.sql b/sqlnexus/PerfStatsAnalysis.sql index cbe3bddc..2acb4a81 100644 --- a/sqlnexus/PerfStatsAnalysis.sql +++ b/sqlnexus/PerfStatsAnalysis.sql @@ -4860,7 +4860,7 @@ BEGIN UPDATE dbo.tbl_AnalysisSummary SET Status = 1, [Description] = [Description] - + ' use query select * from tbl_dm_db_stats_properties where (rows_sampled * 100.00)/ [rows] < 5.0 to identify tables with small sample sizes' + + ' use query select * from tbl_dm_db_stats_properties where (rows_sampled * 100.00)/ NULLIF([rows], 0) < 5.0 to identify tables with small sample sizes' WHERE Name = 'usp_SmallSampledStats'; END; END; From 5c268dfb21e09e538f7ea0b71972c1b2242da186 Mon Sep 17 00:00:00 2001 From: JosephPilov-MSFT <23519517+PiJoCoder@users.noreply.github.com> Date: Wed, 6 May 2026 11:48:52 -0500 Subject: [PATCH 4/5] #488 update file hash for Perfstats script --- sqlnexus/ScriptIntegrity.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlnexus/ScriptIntegrity.cs b/sqlnexus/ScriptIntegrity.cs index 86f1ada7..84c953ed 100644 --- a/sqlnexus/ScriptIntegrity.cs +++ b/sqlnexus/ScriptIntegrity.cs @@ -31,7 +31,7 @@ private static void Log(string msg, bool verbose = false) // Store expected hashes for each allowed script private static readonly Dictionary ScriptHashes = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { Application.StartupPath + "\\" + "PerfStatsAnalysis.sql", "37111E6F2052A2A7B15E26329475738B4E543FE66AFB7BA426639C062D9E81A1" }, + { Application.StartupPath + "\\" + "PerfStatsAnalysis.sql", "841466E4E5F7AB980BB6492D3AEB636C4E55749107DCF391A585601B6263A5E5" }, { Application.StartupPath + "\\" + "ReadTracePostProcessing.sql", "770DE7883BEFFA30C81C5BF45433EFF4C121EF92796047C49AC459103517BB68" }, { Application.StartupPath + "\\" + "ReadTraceReportValidate.sql", "92A575503905D2CABEE18D1804D1DCDCACD12FACD912B16E1040C923AB168E02" }, { Application.StartupPath + "\\" + "SQLNexus_PostProcessing.sql", "BA659CE90DD602AD16C5A8F131D95C1A7D86AA00D764C68C3DE176C5AD0A4139" }, From e880a9f4fef3524ee2a28deb88e2ce6f20f6b4ae Mon Sep 17 00:00:00 2001 From: JosephPilov-MSFT <23519517+PiJoCoder@users.noreply.github.com> Date: Wed, 6 May 2026 11:54:44 -0500 Subject: [PATCH 5/5] #488 another update ofr PerfStats hash after master merge --- sqlnexus/ScriptIntegrity.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlnexus/ScriptIntegrity.cs b/sqlnexus/ScriptIntegrity.cs index bbf2182c..1f5e5bc8 100644 --- a/sqlnexus/ScriptIntegrity.cs +++ b/sqlnexus/ScriptIntegrity.cs @@ -31,7 +31,7 @@ private static void Log(string msg, bool verbose = false) // Store expected hashes for each allowed script private static readonly Dictionary ScriptHashes = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { Application.StartupPath + "\\" + "PerfStatsAnalysis.sql", "841466E4E5F7AB980BB6492D3AEB636C4E55749107DCF391A585601B6263A5E5" }, + { Application.StartupPath + "\\" + "PerfStatsAnalysis.sql", "BB0CF55C8AECF35CDBA1292241F43EE902407AB4C7E92EE2F9BD4C210837B198" }, { Application.StartupPath + "\\" + "ReadTracePostProcessing.sql", "770DE7883BEFFA30C81C5BF45433EFF4C121EF92796047C49AC459103517BB68" }, { Application.StartupPath + "\\" + "ReadTraceReportValidate.sql", "92A575503905D2CABEE18D1804D1DCDCACD12FACD912B16E1040C923AB168E02" }, { Application.StartupPath + "\\" + "SQLNexus_PostProcessing.sql", "BA659CE90DD602AD16C5A8F131D95C1A7D86AA00D764C68C3DE176C5AD0A4139" },