diff --git a/src/PlanViewer.Core/Services/PlanAnalyzer.cs b/src/PlanViewer.Core/Services/PlanAnalyzer.cs index b66d8fe..d89458d 100644 --- a/src/PlanViewer.Core/Services/PlanAnalyzer.cs +++ b/src/PlanViewer.Core/Services/PlanAnalyzer.cs @@ -124,9 +124,12 @@ private static void TryOverrideSeverity(PlanWarning warning, AnalyzerConfig cfg) private static void AnalyzeStatement(PlanStatement stmt, AnalyzerConfig cfg) { // Rule 3: Serial plan with reason - // Skip trivial statements (e.g., variable assignments, constant scans) — not worth warning about + // Skip: trivial cost (< 0.01), TRIVIAL optimization (can't go parallel anyway), + // and 0ms actual elapsed time (not worth flagging). if (!cfg.IsRuleDisabled(3) && !string.IsNullOrEmpty(stmt.NonParallelPlanReason) - && stmt.StatementSubTreeCost >= 0.01) + && stmt.StatementSubTreeCost >= 0.01 + && stmt.StatementOptmLevel != "TRIVIAL" + && !(stmt.QueryTimeStats != null && stmt.QueryTimeStats.ElapsedTimeMs == 0)) { var reason = stmt.NonParallelPlanReason switch { @@ -138,11 +141,14 @@ private static void AnalyzeStatement(PlanStatement stmt, AnalyzerConfig cfg) _ => stmt.NonParallelPlanReason }; + // Only warn (not info) when the user explicitly forced serial execution + var isExplicit = stmt.NonParallelPlanReason is "MaxDOPSetToOne" or "QueryHintNoParallelSet"; + stmt.PlanWarnings.Add(new PlanWarning { WarningType = "Serial Plan", Message = $"Query running serially: {reason}.", - Severity = PlanWarningSeverity.Warning + Severity = isExplicit ? PlanWarningSeverity.Warning : PlanWarningSeverity.Info }); } diff --git a/src/PlanViewer.Web/Pages/Index.razor b/src/PlanViewer.Web/Pages/Index.razor index c714f81..6aae734 100644 --- a/src/PlanViewer.Web/Pages/Index.razor +++ b/src/PlanViewer.Web/Pages/Index.razor @@ -74,9 +74,9 @@ else { @s.EstimatedCost.ToString("N2") } - @if (s.Warnings.Count > 0) + @if (GetAllWarnings(s).Count > 0) { - @s.Warnings.Count + @GetAllWarnings(s).Count } } diff --git a/src/PlanViewer.Web/wwwroot/css/app.css b/src/PlanViewer.Web/wwwroot/css/app.css index 05bbb7d..95b0cb4 100644 --- a/src/PlanViewer.Web/wwwroot/css/app.css +++ b/src/PlanViewer.Web/wwwroot/css/app.css @@ -373,7 +373,8 @@ textarea::placeholder { margin-bottom: 0.75rem; } -/* Wait stats card gets extra width when present */ +/* Give params and waits cards extra width when populated */ +.insight-card.params.has-items, .insight-card.waits.has-items { grid-column: span 2; }