Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
b442b8f
Delete .coderabbit.yaml
erikdarlingdata Mar 20, 2026
37cbe02
Shorten update link text to 'click to install'
erikdarlingdata Mar 20, 2026
7b2b1d7
Merge pull request #130 from erikdarlingdata/fix/update-link-text
erikdarlingdata Mar 20, 2026
efdd31e
Merge pull request #129 from erikdarlingdata/erikdarlingdata-patch-1
erikdarlingdata Mar 20, 2026
d16a861
Fix Query Store time slicer metric label and chart data
erikdarlingdata Mar 20, 2026
aab420a
Merge pull request #132 from erikdarlingdata/fix/slicer-metric-label
erikdarlingdata Mar 20, 2026
4cca2f7
Add Query Store wait stats: global bar/ribbon/table charts, per-row w…
rferraton Mar 22, 2026
00c5c7e
- display gap on waitstats evolution
rferraton Mar 22, 2026
91cf796
Remove verbose wait stats debug logs; improve column toggle
rferraton Mar 23, 2026
133c9b0
Prevent division by zero in wait_ratio calculation
rferraton Mar 23, 2026
ee761c9
Merge pull request #137 from rferraton/feature/query-store-waitstats
erikdarlingdata Mar 23, 2026
2d2ac09
Fix wait stats cleanup: tab indentation and CancellationToken leak
erikdarlingdata Mar 23, 2026
ad52d54
- box selector for time range selection : adapt the selected period
rferraton Mar 24, 2026
97c1192
- add a "move bar" at the top of the selected period
rferraton Mar 24, 2026
dbfaf21
improve perf and stability
rferraton Mar 24, 2026
2d8c595
Fix SkiaSharp native library version mismatch on Linux (#139)
erikdarlingdata Mar 25, 2026
fca1786
Merge pull request #138 from erikdarlingdata/fix/waitstats-cleanup
erikdarlingdata Mar 25, 2026
7be6dfb
Merge pull request #141 from erikdarlingdata/fix/139-skiasharp-linux
erikdarlingdata Mar 25, 2026
141febd
Merge pull request #140 from rferraton/feature/query-store-timerange-…
erikdarlingdata Mar 25, 2026
5a2d4c0
Gate Query Store wait stats for SQL 2017+ with capture mode check
erikdarlingdata Mar 25, 2026
8e5ae2f
Merge pull request #142 from erikdarlingdata/fix/waitstats-version-gate
erikdarlingdata Mar 25, 2026
7e906f2
Improve Query Store grid query performance (#143)
erikdarlingdata Mar 25, 2026
8529af3
Merge pull request #144 from erikdarlingdata/fix/143-query-store-perf
erikdarlingdata Mar 25, 2026
c72125a
Rewrite Query Store grid query using sp_QuickieStore patterns (#143)
erikdarlingdata Mar 25, 2026
7d259f2
Merge pull request #145 from erikdarlingdata/fix/143-query-store-perf-v2
erikdarlingdata Mar 25, 2026
1ad13d2
adding a progress status bar for fetching grid data in the querystore…
rferraton Mar 25, 2026
7b9346c
fix issue with lateral handled of the time range selector
rferraton Mar 25, 2026
46fdaa8
Add planIds filter to FetchPlanWaitStatsAsync
rferraton Mar 26, 2026
bcdb290
Fix bug due to alias on order by clause that are no more relevant and…
rferraton Mar 26, 2026
b8678d0
Merge pull request #148 from rferraton/fix/querystore-improvment-and-…
erikdarlingdata Mar 26, 2026
3a84221
Post-merge cleanup for PR #148
erikdarlingdata Mar 26, 2026
a7b0ad9
Merge pull request #149 from erikdarlingdata/fix/148-post-merge-cleanup
erikdarlingdata Mar 26, 2026
fef35fb
Fix search filter not applied and slicer reset on Fetch (#147)
erikdarlingdata Mar 26, 2026
a827183
Merge pull request #150 from erikdarlingdata/fix/147-search-and-slice…
erikdarlingdata Mar 27, 2026
1196c6c
add quick filter buttons and calendar for custom periode filter
rferraton Mar 27, 2026
65901ec
fix display for quick filter and timeslicer font (fixed type)
rferraton Mar 27, 2026
824efaa
find the max in the period feature
rferraton Mar 27, 2026
4b13bc8
select top1 (dynamic) instead of all selected by default
rferraton Mar 27, 2026
741313a
Add GitHub Sponsors funding link
erikdarlingdata Mar 28, 2026
57e74fb
Merge pull request #152 from erikdarlingdata/add-funding-yml
erikdarlingdata Mar 28, 2026
23e978f
QS - TimeSlicer : 48h quick filter button comes back
rferraton Mar 28, 2026
27e03be
Merge pull request #151 from rferraton/feature/query-store-timeslicer…
erikdarlingdata Mar 28, 2026
4bda395
- Create FormatWaitRatio helper method in WaitStatsModels.cs
rferraton Mar 28, 2026
3301e02
- improve label readability for avg wait ratio by using black font ov…
rferraton Mar 28, 2026
fbd47b0
Merge pull request #153 from rferraton/feature/query-store-wait-stats…
erikdarlingdata Mar 28, 2026
107d2d5
Fix wait stats cleanup: duplicate using, label overlap, avg label cli…
erikdarlingdata Mar 28, 2026
6fad379
Merge pull request #154 from erikdarlingdata/fix/wait-stats-cleanup
erikdarlingdata Mar 28, 2026
30eeb30
Bump to v1.3.0
erikdarlingdata Mar 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 0 additions & 65 deletions .coderabbit.yaml

This file was deleted.

1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github: erikdarlingdata
2 changes: 1 addition & 1 deletion src/PlanViewer.App/AboutWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ private async void CheckUpdate_Click(object? sender, RoutedEventArgs e)
if (_velopackUpdate != null)
{
UpdateStatusText.Text = "Update available:";
UpdateLink.Text = $"v{_velopackUpdate.TargetFullRelease.Version} — click to download and install";
UpdateLink.Text = $"v{_velopackUpdate.TargetFullRelease.Version} — click to install";
UpdateLink.IsVisible = true;
CheckUpdateButton.IsEnabled = true;
return;
Expand Down
17 changes: 16 additions & 1 deletion src/PlanViewer.App/Controls/QuerySessionControl.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1021,11 +1021,26 @@ private async void QueryStore_Click(object? sender, RoutedEventArgs e)

SetStatus("");

// Check if wait stats are supported (SQL 2017+ / Azure) and capture is enabled
var supportsWaitStats = _serverMetadata?.SupportsQueryStoreWaitStats ?? false;
if (supportsWaitStats)
{
try
{
var connStr = _serverConnection!.GetConnectionString(_credentialService, _selectedDatabase!);
supportsWaitStats = await QueryStoreService.IsWaitStatsCaptureEnabledAsync(connStr);
}
catch
{
supportsWaitStats = false;
}
}

// Build database list from the current DatabaseBox
var databases = DatabaseBox.Items.OfType<string>().ToList();

var grid = new QueryStoreGridControl(_serverConnection!, _credentialService,
_selectedDatabase!, databases);
_selectedDatabase!, databases, supportsWaitStats);
grid.PlansSelected += OnQueryStorePlansSelected;

var headerText = new TextBlock
Expand Down
62 changes: 58 additions & 4 deletions src/PlanViewer.App/Controls/QueryStoreGridControl.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,26 @@
x:Class="PlanViewer.App.Controls.QueryStoreGridControl"
Background="{DynamicResource BackgroundBrush}">
<Grid RowDefinitions="Auto,Auto,*">
<!-- Time Range Slicer -->
<local:TimeRangeSlicerControl x:Name="TimeRangeSlicer" Grid.Row="0"/>
<!-- Time Range Slicer + Wait Stats Profile -->
<Grid Grid.Row="0" x:Name="SlicerRow" ColumnDefinitions="2*,Auto,*">
<local:TimeRangeSlicerControl x:Name="TimeRangeSlicer" Grid.Column="0"/>
<!-- Resizable separator with chevron overlay -->
<GridSplitter x:Name="WaitStatsSplitter" Grid.Column="1" Width="14"
Background="{DynamicResource BorderBrush}"
ResizeDirection="Columns"/>
<Button x:Name="WaitStatsChevronButton" Grid.Column="1"
Content="»"
Width="14" Height="28" Padding="0"
FontSize="11" FontWeight="Bold"
Background="Transparent" BorderThickness="0"
Foreground="{DynamicResource ForegroundBrush}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
IsHitTestVisible="True"
ToolTip.Tip="Collapse / expand wait stats panel"
Click="WaitStatsChevron_Click"/>
<local:WaitStatsProfileControl x:Name="WaitStatsProfile" Grid.Column="2"/>
</Grid>

<!-- Toolbar -->
<Border Grid.Row="1" Background="{DynamicResource BackgroundDarkBrush}" Padding="8,6"
Expand Down Expand Up @@ -91,8 +109,9 @@
</StackPanel>
</Border>

<!-- DataGrid -->
<DataGrid Grid.Row="2" x:Name="ResultsGrid"
<!-- DataGrid + loading overlay -->
<Grid Grid.Row="2">
<DataGrid x:Name="ResultsGrid"
AutoGenerateColumns="False"
CanUserSortColumns="True"
CanUserReorderColumns="True"
Expand Down Expand Up @@ -134,6 +153,29 @@
<DataGridTextColumn Header="Query Hash" Binding="{ReflectionBinding QueryHash}" SortMemberPath="QueryHash" Width="150"/>
<DataGridTextColumn Header="Plan Hash" Binding="{ReflectionBinding QueryPlanHash}" SortMemberPath="QueryPlanHash" Width="150"/>
<DataGridTextColumn Header="Module" Binding="{ReflectionBinding ModuleName}" SortMemberPath="ModuleName" Width="140"/>
<DataGridTemplateColumn SortMemberPath="WaitGrandTotalSort" Width="160">
<DataGridTemplateColumn.Header>
<StackPanel Orientation="Horizontal" Spacing="4">
<Button Content="v" Width="20" Height="18" Padding="0"
FontSize="10" FontWeight="Bold"
Background="Transparent" BorderThickness="1"
BorderBrush="{DynamicResource ForegroundMutedBrush}"
Foreground="{DynamicResource ForegroundBrush}"
ToolTip.Tip="Toggle value (v) / percent (%) stacked bar"
Click="WaitModeToggle_Click"/>
<TextBlock Text="Wait Profile" VerticalAlignment="Center"/>
</StackPanel>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="local:QueryStoreRow">
<local:WaitProfileBarControl Height="14" Margin="2,1"
Profile="{Binding WaitProfile}"
HighlightCategory="{Binding WaitHighlightCategory}"
PercentMode="{Binding WaitPercentMode}"
MaxGrandTotalRatio="{Binding WaitMaxGrandTotal}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Last Executed (Local)" Binding="{ReflectionBinding LastExecutedLocal}" SortMemberPath="LastExecutedLocal" Width="160"/>
<DataGridTemplateColumn Header="Executions" SortMemberPath="ExecsSort" Width="100">
<DataGridTemplateColumn.CellTemplate>
Expand Down Expand Up @@ -277,5 +319,17 @@
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!-- Loading overlay -->
<Border x:Name="GridLoadingOverlay" IsVisible="False"
Background="#80000000" CornerRadius="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="8">
<ProgressBar IsIndeterminate="True" Width="200" Height="4"/>
<TextBlock x:Name="GridLoadingText" Text="Fetching plans..."
FontSize="12" HorizontalAlignment="Center"
Foreground="{DynamicResource ForegroundBrush}"/>
</StackPanel>
</Border>
</Grid>
</Grid>
</UserControl>
Loading
Loading