@@ -141,6 +141,7 @@ public PlanViewerControl()
141141 var layoutTransform = this . FindControl < Avalonia . Controls . LayoutTransformControl > ( "PlanLayoutTransform" ) ! ;
142142 _zoomTransform = ( ScaleTransform ) layoutTransform . LayoutTransform ! ;
143143
144+ Helpers . DataGridBehaviors . Attach ( StatementsGrid ) ;
144145 }
145146
146147 /// <summary>
@@ -377,7 +378,7 @@ private void RenderStatement(PlanStatement statement)
377378 // Update banners
378379 ShowMissingIndexes ( statement . MissingIndexes ) ;
379380 ShowParameters ( statement ) ;
380- ShowWaitStats ( statement . WaitStats , statement . QueryTimeStats != null ) ;
381+ ShowWaitStats ( statement . WaitStats , statement . WaitBenefits , statement . QueryTimeStats != null ) ;
381382 ShowRuntimeSummary ( statement ) ;
382383 UpdateInsightsHeader ( ) ;
383384
@@ -2635,7 +2636,7 @@ private static long GetChildElapsedMsSum(PlanNode node)
26352636 return sum ;
26362637 }
26372638
2638- private void ShowWaitStats ( List < WaitStatInfo > waits , bool isActualPlan )
2639+ private void ShowWaitStats ( List < WaitStatInfo > waits , List < WaitBenefit > benefits , bool isActualPlan )
26392640 {
26402641 WaitStatsContent . Children . Clear ( ) ;
26412642
@@ -2651,6 +2652,11 @@ private void ShowWaitStats(List<WaitStatInfo> waits, bool isActualPlan)
26512652
26522653 WaitStatsEmpty . IsVisible = false ;
26532654
2655+ // Build benefit lookup
2656+ var benefitLookup = new Dictionary < string , double > ( StringComparer . OrdinalIgnoreCase ) ;
2657+ foreach ( var wb in benefits )
2658+ benefitLookup [ wb . WaitType ] = wb . MaxBenefitPercent ;
2659+
26542660 var sorted = waits . OrderByDescending ( w => w . WaitTimeMs ) . ToList ( ) ;
26552661 var maxWait = sorted [ 0 ] . WaitTimeMs ;
26562662 var totalWait = sorted . Sum ( w => w . WaitTimeMs ) ;
@@ -2659,10 +2665,10 @@ private void ShowWaitStats(List<WaitStatInfo> waits, bool isActualPlan)
26592665 WaitStatsHeader . Text = $ " Wait Stats \u2014 { totalWait : N0} ms total";
26602666
26612667 // Build a single Grid for all rows so columns align
2662- // Name and duration auto-size; bar fills remaining space
2668+ // Name, bar, duration, and benefit columns
26632669 var grid = new Grid
26642670 {
2665- ColumnDefinitions = new ColumnDefinitions ( "Auto,*,Auto" )
2671+ ColumnDefinitions = new ColumnDefinitions ( "Auto,*,Auto,Auto " )
26662672 } ;
26672673 for ( int i = 0 ; i < sorted . Count ; i ++ )
26682674 grid . RowDefinitions . Add ( new RowDefinition ( GridLength . Auto ) ) ;
@@ -2709,11 +2715,27 @@ private void ShowWaitStats(List<WaitStatInfo> waits, bool isActualPlan)
27092715 FontSize = 12 ,
27102716 Foreground = new SolidColorBrush ( Color . Parse ( "#E4E6EB" ) ) ,
27112717 VerticalAlignment = VerticalAlignment . Center ,
2712- Margin = new Thickness ( 0 , 2 , 0 , 2 )
2718+ Margin = new Thickness ( 0 , 2 , 8 , 2 )
27132719 } ;
27142720 Grid . SetRow ( durationText , i ) ;
27152721 Grid . SetColumn ( durationText , 2 ) ;
27162722 grid . Children . Add ( durationText ) ;
2723+
2724+ // Benefit % (if available)
2725+ if ( benefitLookup . TryGetValue ( w . WaitType , out var benefitPct ) && benefitPct > 0 )
2726+ {
2727+ var benefitText = new TextBlock
2728+ {
2729+ Text = $ "up to { benefitPct : N0} %",
2730+ FontSize = 11 ,
2731+ Foreground = new SolidColorBrush ( Color . Parse ( "#8b949e" ) ) ,
2732+ VerticalAlignment = VerticalAlignment . Center ,
2733+ Margin = new Thickness ( 0 , 2 , 0 , 2 )
2734+ } ;
2735+ Grid . SetRow ( benefitText , i ) ;
2736+ Grid . SetColumn ( benefitText , 3 ) ;
2737+ grid . Children . Add ( benefitText ) ;
2738+ }
27172739 }
27182740
27192741 WaitStatsContent . Children . Add ( grid ) ;
0 commit comments