Skip to content

Commit d429c93

Browse files
Merge pull request #293 from erikdarlingdata/worktree-issue-281-medium-gaps
Issue #281: Surface hidden columns in memory, procedure, and query store grids
2 parents c437185 + 8af09ee commit d429c93

4 files changed

Lines changed: 138 additions & 4 deletions

File tree

Lite/Controls/ServerTab.xaml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,33 @@
463463
<DataGridTextColumn Binding="{Binding MaxElapsedMs, StringFormat=N2}" ElementStyle="{StaticResource NumericCell}" Width="120">
464464
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MaxElapsedMs" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Max Duration (ms)" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
465465
</DataGridTextColumn>
466+
<DataGridTextColumn Binding="{Binding MinLogicalReads, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="100">
467+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MinLogicalReads" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Min Reads" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
468+
</DataGridTextColumn>
469+
<DataGridTextColumn Binding="{Binding MaxLogicalReads, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="100">
470+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MaxLogicalReads" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Max Reads" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
471+
</DataGridTextColumn>
472+
<DataGridTextColumn Binding="{Binding MinPhysicalReads, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="110">
473+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MinPhysicalReads" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Min Phys Reads" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
474+
</DataGridTextColumn>
475+
<DataGridTextColumn Binding="{Binding MaxPhysicalReads, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="110">
476+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MaxPhysicalReads" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Max Phys Reads" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
477+
</DataGridTextColumn>
478+
<DataGridTextColumn Binding="{Binding MinLogicalWrites, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="100">
479+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MinLogicalWrites" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Min Writes" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
480+
</DataGridTextColumn>
481+
<DataGridTextColumn Binding="{Binding MaxLogicalWrites, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="100">
482+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MaxLogicalWrites" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Max Writes" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
483+
</DataGridTextColumn>
484+
<DataGridTextColumn Binding="{Binding MinSpills, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="90">
485+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MinSpills" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Min Spills" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
486+
</DataGridTextColumn>
487+
<DataGridTextColumn Binding="{Binding MaxSpills, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="90">
488+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="MaxSpills" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Max Spills" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
489+
</DataGridTextColumn>
490+
<DataGridTextColumn Binding="{Binding CachedTimeFormatted}" Width="140">
491+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="CachedTimeFormatted" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Cached Time" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
492+
</DataGridTextColumn>
466493
<DataGridTextColumn Binding="{Binding PlanHandle}" Width="140">
467494
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="PlanHandle" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Plan Handle" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
468495
</DataGridTextColumn>
@@ -546,6 +573,33 @@
546573
<DataGridTextColumn Binding="{Binding PlanForcingType}" Width="100">
547574
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="PlanForcingType" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Force Type" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
548575
</DataGridTextColumn>
576+
<DataGridTextColumn Binding="{Binding ExecutionTypeDesc}" Width="100">
577+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="ExecutionTypeDesc" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Exec Type" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
578+
</DataGridTextColumn>
579+
<DataGridTextColumn Binding="{Binding FirstExecutionTimeLocal}" Width="130">
580+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="FirstExecutionTimeLocal" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="First Execution" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
581+
</DataGridTextColumn>
582+
<DataGridTextColumn Binding="{Binding AvgClrTimeMs, StringFormat=N2}" ElementStyle="{StaticResource NumericCell}" Width="100">
583+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="AvgClrTimeMs" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Avg CLR (ms)" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
584+
</DataGridTextColumn>
585+
<DataGridTextColumn Binding="{Binding AvgTempdbSpaceUsed, StringFormat=N1}" ElementStyle="{StaticResource NumericCell}" Width="120">
586+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="AvgTempdbSpaceUsed" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Avg TempDB Pages" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
587+
</DataGridTextColumn>
588+
<DataGridTextColumn Binding="{Binding AvgLogBytesUsed, StringFormat=N0}" ElementStyle="{StaticResource NumericCell}" Width="110">
589+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="AvgLogBytesUsed" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Avg Log Bytes" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
590+
</DataGridTextColumn>
591+
<DataGridTextColumn Binding="{Binding PlanType}" Width="90">
592+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="PlanType" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Plan Type" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
593+
</DataGridTextColumn>
594+
<DataGridTextColumn Binding="{Binding ForceFailureCount}" ElementStyle="{StaticResource NumericCell}" Width="110">
595+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="ForceFailureCount" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Force Failures" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
596+
</DataGridTextColumn>
597+
<DataGridTextColumn Binding="{Binding LastForceFailureReason}" Width="140">
598+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="LastForceFailureReason" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Force Failure Reason" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
599+
</DataGridTextColumn>
600+
<DataGridTextColumn Binding="{Binding CompatibilityLevel}" ElementStyle="{StaticResource NumericCell}" Width="80">
601+
<DataGridTextColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="CompatibilityLevel" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Compat" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTextColumn.Header>
602+
</DataGridTextColumn>
549603
<DataGridTemplateColumn Width="500">
550604
<DataGridTemplateColumn.Header><StackPanel Orientation="Horizontal"><Button Style="{DynamicResource ColumnFilterButtonStyle}" Tag="QueryText" Click="FilterButton_Click" Margin="0,0,4,0"/><TextBlock Text="Query Text" FontWeight="Bold" VerticalAlignment="Center"/></StackPanel></DataGridTemplateColumn.Header>
551605
<DataGridTemplateColumn.CellTemplate>
@@ -628,10 +682,26 @@
628682
<TextBlock Text="Plan Cache" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
629683
<TextBlock x:Name="PlanCacheText" Text="--" FontSize="18" FontWeight="SemiBold"/>
630684
</StackPanel>
685+
<StackPanel Margin="0,0,24,0">
686+
<TextBlock Text="Available Physical" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
687+
<TextBlock x:Name="AvailablePhysicalMemoryText" Text="--" FontSize="18" FontWeight="SemiBold"/>
688+
</StackPanel>
689+
<StackPanel Margin="0,0,24,0">
690+
<TextBlock Text="Total Page File" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
691+
<TextBlock x:Name="TotalPageFileText" Text="--" FontSize="18" FontWeight="SemiBold"/>
692+
</StackPanel>
693+
<StackPanel Margin="0,0,24,0">
694+
<TextBlock Text="Available Page File" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
695+
<TextBlock x:Name="AvailablePageFileText" Text="--" FontSize="18" FontWeight="SemiBold"/>
696+
</StackPanel>
631697
<StackPanel Margin="0,0,24,0">
632698
<TextBlock Text="System Memory State" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
633699
<TextBlock x:Name="MemoryStateText" Text="--" FontSize="18" FontWeight="SemiBold"/>
634700
</StackPanel>
701+
<StackPanel Margin="0,0,24,0">
702+
<TextBlock Text="Memory Model" Foreground="{StaticResource ForegroundDimBrush}" FontSize="11"/>
703+
<TextBlock x:Name="SqlMemoryModelText" Text="--" FontSize="18" FontWeight="SemiBold"/>
704+
</StackPanel>
635705
</WrapPanel>
636706
</Border>
637707

Lite/Controls/ServerTab.xaml.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,20 +661,28 @@ private void UpdateMemorySummary(MemoryStatsRow? stats)
661661
if (stats == null)
662662
{
663663
PhysicalMemoryText.Text = "--";
664+
AvailablePhysicalMemoryText.Text = "--";
664665
TotalServerMemoryText.Text = "--";
665666
TargetServerMemoryText.Text = "--";
666667
BufferPoolText.Text = "--";
667668
PlanCacheText.Text = "--";
669+
TotalPageFileText.Text = "--";
670+
AvailablePageFileText.Text = "--";
668671
MemoryStateText.Text = "--";
672+
SqlMemoryModelText.Text = "--";
669673
return;
670674
}
671675

672676
PhysicalMemoryText.Text = FormatMb(stats.TotalPhysicalMemoryMb);
677+
AvailablePhysicalMemoryText.Text = FormatMb(stats.AvailablePhysicalMemoryMb);
673678
TotalServerMemoryText.Text = FormatMb(stats.TotalServerMemoryMb);
674679
TargetServerMemoryText.Text = FormatMb(stats.TargetServerMemoryMb);
675680
BufferPoolText.Text = FormatMb(stats.BufferPoolMb);
676681
PlanCacheText.Text = FormatMb(stats.PlanCacheMb);
682+
TotalPageFileText.Text = FormatMb(stats.TotalPageFileMb);
683+
AvailablePageFileText.Text = FormatMb(stats.AvailablePageFileMb);
677684
MemoryStateText.Text = stats.SystemMemoryState;
685+
SqlMemoryModelText.Text = stats.SqlMemoryModel;
678686
}
679687

680688
private static string FormatMb(double mb)

Lite/Services/LocalDataService.QueryStats.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,15 @@ public async Task<List<ProcedureStatsRow>> GetTopProceduresByCpuAsync(int server
387387
MIN(min_elapsed_time) AS min_elapsed_time,
388388
MAX(max_elapsed_time) AS max_elapsed_time,
389389
SUM(total_spills) AS total_spills,
390+
MIN(min_logical_reads) AS min_logical_reads,
391+
MAX(max_logical_reads) AS max_logical_reads,
392+
MIN(min_physical_reads) AS min_physical_reads,
393+
MAX(max_physical_reads) AS max_physical_reads,
394+
MIN(min_logical_writes) AS min_logical_writes,
395+
MAX(max_logical_writes) AS max_logical_writes,
396+
MIN(min_spills) AS min_spills,
397+
MAX(max_spills) AS max_spills,
398+
MAX(cached_time) AS cached_time,
390399
MAX(sql_handle) AS sql_handle,
391400
MAX(plan_handle) AS plan_handle
392401
FROM v_procedure_stats
@@ -426,8 +435,17 @@ ORDER BY SUM(delta_elapsed_time) DESC
426435
MinElapsedTimeUs = reader.IsDBNull(12) ? 0 : reader.GetInt64(12),
427436
MaxElapsedTimeUs = reader.IsDBNull(13) ? 0 : reader.GetInt64(13),
428437
TotalSpills = reader.IsDBNull(14) ? 0 : reader.GetInt64(14),
429-
SqlHandle = reader.IsDBNull(15) ? "" : reader.GetString(15),
430-
PlanHandle = reader.IsDBNull(16) ? "" : reader.GetString(16)
438+
MinLogicalReads = reader.IsDBNull(15) ? 0 : reader.GetInt64(15),
439+
MaxLogicalReads = reader.IsDBNull(16) ? 0 : reader.GetInt64(16),
440+
MinPhysicalReads = reader.IsDBNull(17) ? 0 : reader.GetInt64(17),
441+
MaxPhysicalReads = reader.IsDBNull(18) ? 0 : reader.GetInt64(18),
442+
MinLogicalWrites = reader.IsDBNull(19) ? 0 : reader.GetInt64(19),
443+
MaxLogicalWrites = reader.IsDBNull(20) ? 0 : reader.GetInt64(20),
444+
MinSpills = reader.IsDBNull(21) ? 0 : reader.GetInt64(21),
445+
MaxSpills = reader.IsDBNull(22) ? 0 : reader.GetInt64(22),
446+
CachedTime = reader.IsDBNull(23) ? (DateTime?)null : reader.GetDateTime(23),
447+
SqlHandle = reader.IsDBNull(24) ? "" : reader.GetString(24),
448+
PlanHandle = reader.IsDBNull(25) ? "" : reader.GetString(25)
431449
});
432450
}
433451

@@ -637,6 +655,15 @@ public class ProcedureStatsRow
637655
public long MinElapsedTimeUs { get; set; }
638656
public long MaxElapsedTimeUs { get; set; }
639657
public long TotalSpills { get; set; }
658+
public long MinLogicalReads { get; set; }
659+
public long MaxLogicalReads { get; set; }
660+
public long MinPhysicalReads { get; set; }
661+
public long MaxPhysicalReads { get; set; }
662+
public long MinLogicalWrites { get; set; }
663+
public long MaxLogicalWrites { get; set; }
664+
public long MinSpills { get; set; }
665+
public long MaxSpills { get; set; }
666+
public DateTime? CachedTime { get; set; }
640667
public string SqlHandle { get; set; } = "";
641668
public string PlanHandle { get; set; } = "";
642669
public string FullName => string.IsNullOrEmpty(SchemaName) ? ObjectName : $"{SchemaName}.{ObjectName}";
@@ -649,6 +676,7 @@ public class ProcedureStatsRow
649676
public double MaxCpuMs => MaxWorkerTimeUs / 1000.0;
650677
public double MinElapsedMs => MinElapsedTimeUs / 1000.0;
651678
public double MaxElapsedMs => MaxElapsedTimeUs / 1000.0;
679+
public string CachedTimeFormatted => CachedTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? "";
652680
}
653681

654682
public class QueryStatsHistoryRow

0 commit comments

Comments
 (0)