Skip to content

Commit a88572c

Browse files
Merge pull request #852 from erikdarlingdata/fix/lazy-load-server-tabs
Lazy-load server tabs and cap query grid results to TOP 500
2 parents 32f0154 + 3db895c commit a88572c

3 files changed

Lines changed: 19 additions & 12 deletions

File tree

Dashboard/ServerTab.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
<StackPanel Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Orientation="Vertical" Margin="15,0,0,0">
102102
<StackPanel Orientation="Horizontal">
103103
<Button x:Name="ApplyToAllButton" Content="Apply to All Tabs" Click="ApplyToAllTabs_Click" Margin="2,0" Padding="12,5" Style="{DynamicResource AccentButton}"/>
104-
<Button x:Name="RefreshButton" Content="Refresh Tab" Click="RefreshButton_Click" Margin="2,0" Padding="12,5" Style="{DynamicResource SuccessButton}"/>
104+
<Button x:Name="RefreshButton" Content="Refresh Tab" Click="RefreshButton_Click" Margin="2,0" Padding="12,5" Style="{DynamicResource SuccessButton}" ToolTip="Refresh the current tab. Ctrl+Click to refresh all tabs."/>
105105
<ToggleButton x:Name="AutoRefreshToggle" Content="Auto-Refresh: Off" Click="AutoRefreshToggle_Click" Margin="8,0,2,0" Padding="12,5" MinWidth="130" ToolTip="Toggle auto-refresh on/off. Configure interval in Settings."/>
106106
<Button Content="Edit Schedules" Click="EditSchedules_Click" Margin="8,0,2,0" Padding="12,5" Style="{DynamicResource AccentButton}" ToolTip="Edit collector schedules (frequency, retention, enabled/disabled)"/>
107107
<TextBlock Text="|" VerticalAlignment="Center" Margin="8,0,4,0" Foreground="{DynamicResource ForegroundBrush}"/>

Dashboard/ServerTab.xaml.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public partial class ServerTab : UserControl
5151
private bool _isRefreshing;
5252
private DateTime _refreshStartedUtc;
5353
private bool _suppressPickerUpdates;
54+
private readonly HashSet<string> _initializedTabs = new();
5455

5556
// Filter state dictionaries for each DataGrid
5657

@@ -424,6 +425,7 @@ public void CleanupOnClose()
424425
_autoRefreshCts?.Cancel();
425426
_autoRefreshTimer?.Stop();
426427
_autoRefreshTimer = null;
428+
_initializedTabs.Clear();
427429

428430
Helpers.ThemeManager.ThemeChanged -= OnThemeChanged;
429431
Loaded -= ServerTab_Loaded;
@@ -549,7 +551,8 @@ private async void ServerTab_KeyDown(object sender, System.Windows.Input.KeyEven
549551
if (e.Key == System.Windows.Input.Key.F5)
550552
{
551553
e.Handled = true;
552-
await LoadDataAsync();
554+
bool fullRefresh = System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control);
555+
await LoadDataAsync(fullRefresh);
553556
}
554557
else if (e.Key == System.Windows.Input.Key.V &&
555558
System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control &&
@@ -640,7 +643,7 @@ private async void ServerTab_Loaded(object sender, RoutedEventArgs e)
640643
CriticalIssuesTab.SetTimeRange(_globalHoursBack, _globalFromDate, _globalToDate);
641644
DefaultTraceTab.SetTimeRange(_globalHoursBack, _globalFromDate, _globalToDate);
642645

643-
await LoadDataAsync();
646+
await LoadDataAsync(fullRefresh: false);
644647
SetupAutoRefresh();
645648
}
646649
catch (Exception ex)
@@ -654,7 +657,8 @@ private async void RefreshButton_Click(object sender, RoutedEventArgs e)
654657
{
655658
try
656659
{
657-
await LoadDataAsync();
660+
bool fullRefresh = System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control);
661+
await LoadDataAsync(fullRefresh);
658662
}
659663
catch (Exception ex)
660664
{
@@ -1271,34 +1275,37 @@ private async Task RefreshAllTabsAsync()
12711275
}
12721276

12731277
/// <summary>
1274-
/// Refreshes only the currently visible tab — used on auto-refresh timer tick.
1278+
/// Refreshes only the currently visible tab. On first visit to a tab,
1279+
/// does a full refresh so all sub-tabs are populated. Subsequent visits
1280+
/// only refresh the active sub-tab for speed.
12751281
/// </summary>
12761282
private async Task RefreshVisibleTabAsync()
12771283
{
12781284
var selectedTab = DataTabControl.SelectedItem as TabItem;
12791285
if (selectedTab == null) return;
12801286

12811287
var tabHeader = GetTabHeaderText(selectedTab);
1288+
bool firstVisit = _initializedTabs.Add(tabHeader);
12821289

12831290
switch (tabHeader)
12841291
{
12851292
case "Overview":
12861293
await RefreshOverviewTabAsync();
12871294
break;
12881295
case "Queries":
1289-
await RefreshQueriesTabAsync(fullRefresh: false);
1296+
await RefreshQueriesTabAsync(fullRefresh: firstVisit);
12901297
break;
12911298
case "Resource Metrics":
1292-
await RefreshResourceMetricsTabAsync(fullRefresh: false);
1299+
await RefreshResourceMetricsTabAsync(fullRefresh: firstVisit);
12931300
break;
12941301
case "Memory":
1295-
await RefreshMemoryTabAsync(fullRefresh: false);
1302+
await RefreshMemoryTabAsync(fullRefresh: firstVisit);
12961303
break;
12971304
case "Locking":
12981305
await RefreshLockingTabAsync();
12991306
break;
13001307
case "System Events":
1301-
await RefreshSystemEventsTabAsync(fullRefresh: false);
1308+
await RefreshSystemEventsTabAsync(fullRefresh: firstVisit);
13021309
break;
13031310
// Plan Viewer has no data to refresh
13041311
}

Dashboard/Services/DatabaseService.QueryPerformance.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,7 @@ GROUP BY
11101110
qs.query_hash,
11111111
qs.creation_time
11121112
)
1113-
SELECT
1113+
SELECT TOP (500)
11141114
database_name = pl.database_name,
11151115
query_hash = CONVERT(nvarchar(20), pl.query_hash, 1),
11161116
object_type = MAX(pl.object_type),
@@ -1345,7 +1345,7 @@ GROUP BY
13451345
ps.object_name,
13461346
ps.cached_time
13471347
)
1348-
SELECT
1348+
SELECT TOP (500)
13491349
database_name = pl.database_name,
13501350
object_id = MAX(pl.object_id),
13511351
object_name = QUOTENAME(pl.schema_name) + N'.' + QUOTENAME(pl.object_name),
@@ -1520,7 +1520,7 @@ public async Task<List<QueryStoreItem>> GetQueryStoreDataAsync(int hoursBack = 2
15201520
string query = @"
15211521
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
15221522
1523-
SELECT
1523+
SELECT TOP (500)
15241524
database_name = qsd.database_name,
15251525
query_id = qsd.query_id,
15261526
execution_type_desc = MAX(qsd.execution_type_desc),

0 commit comments

Comments
 (0)