@@ -124,9 +124,12 @@ private static void TryOverrideSeverity(PlanWarning warning, AnalyzerConfig cfg)
124124 private static void AnalyzeStatement ( PlanStatement stmt , AnalyzerConfig cfg )
125125 {
126126 // Rule 3: Serial plan with reason
127- // Skip trivial statements (e.g., variable assignments, constant scans) — not worth warning about
127+ // Skip: trivial cost (< 0.01), TRIVIAL optimization (can't go parallel anyway),
128+ // and 0ms actual elapsed time (not worth flagging).
128129 if ( ! cfg . IsRuleDisabled ( 3 ) && ! string . IsNullOrEmpty ( stmt . NonParallelPlanReason )
129- && stmt . StatementSubTreeCost >= 0.01 )
130+ && stmt . StatementSubTreeCost >= 0.01
131+ && stmt . StatementOptmLevel != "TRIVIAL"
132+ && ! ( stmt . QueryTimeStats != null && stmt . QueryTimeStats . ElapsedTimeMs == 0 ) )
130133 {
131134 var reason = stmt . NonParallelPlanReason switch
132135 {
@@ -138,11 +141,14 @@ private static void AnalyzeStatement(PlanStatement stmt, AnalyzerConfig cfg)
138141 _ => stmt . NonParallelPlanReason
139142 } ;
140143
144+ // Only warn (not info) when the user explicitly forced serial execution
145+ var isExplicit = stmt . NonParallelPlanReason is "MaxDOPSetToOne" or "QueryHintNoParallelSet" ;
146+
141147 stmt . PlanWarnings . Add ( new PlanWarning
142148 {
143149 WarningType = "Serial Plan" ,
144150 Message = $ "Query running serially: { reason } .",
145- Severity = PlanWarningSeverity . Warning
151+ Severity = isExplicit ? PlanWarningSeverity . Warning : PlanWarningSeverity . Info
146152 } ) ;
147153 }
148154
0 commit comments