diff --git a/sqlnexus/PerfStatsAnalysis.sql b/sqlnexus/PerfStatsAnalysis.sql index 28a9891c..0a9dbafa 100644 --- a/sqlnexus/PerfStatsAnalysis.sql +++ b/sqlnexus/PerfStatsAnalysis.sql @@ -1165,13 +1165,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 + ) / 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 LEFT OUTER JOIN dbo.vw_WAIT_CATEGORY_STATS w_start @@ -1192,7 +1203,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' @@ -1284,8 +1295,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 @@ -1294,8 +1310,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', @@ -1356,7 +1373,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' @@ -1444,8 +1461,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' @@ -1475,12 +1497,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); @@ -1580,7 +1598,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 @@ -4871,13 +4889,13 @@ 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 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; @@ -4890,7 +4908,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), @@ -5291,8 +5309,7 @@ BEGIN UPDATE dbo.tbl_SysDatabases SET is_auto_update_stats_on = 0 WHERE name = 'notexist'; - SELECT * - FROM dbo.tbl_AnalysisSummary; + IF EXISTS ( SELECT * diff --git a/sqlnexus/ScriptIntegrity.cs b/sqlnexus/ScriptIntegrity.cs index 992383be..1f5e5bc8 100644 --- a/sqlnexus/ScriptIntegrity.cs +++ b/sqlnexus/ScriptIntegrity.cs @@ -29,9 +29,9 @@ 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", "04BB7D6D1F843020105893AB58333D4168DD5460F116F5CBBE153A6C7B092A77" }, + + private static readonly Dictionary ScriptHashes = new Dictionary(StringComparer.OrdinalIgnoreCase) { + { Application.StartupPath + "\\" + "PerfStatsAnalysis.sql", "BB0CF55C8AECF35CDBA1292241F43EE902407AB4C7E92EE2F9BD4C210837B198" }, { Application.StartupPath + "\\" + "ReadTracePostProcessing.sql", "770DE7883BEFFA30C81C5BF45433EFF4C121EF92796047C49AC459103517BB68" }, { Application.StartupPath + "\\" + "ReadTraceReportValidate.sql", "92A575503905D2CABEE18D1804D1DCDCACD12FACD912B16E1040C923AB168E02" }, { Application.StartupPath + "\\" + "SQLNexus_PostProcessing.sql", "BA659CE90DD602AD16C5A8F131D95C1A7D86AA00D764C68C3DE176C5AD0A4139" },