Scenario
A customer-facing dashboard got slower every week as data grew. The instance was not CPU-bound, but query latency kept climbing and users complained the dashboard "felt heavy" by mid-quarter.
Symptoms
- Dashboard latency rising steadily with data volume, not with user count.
- CPU comfortable; the bottleneck was clearly elsewhere.
- A handful of read-heavy queries dominated logical and physical reads.
How We Analyzed It
Each step maps a concrete question to the module and signal used to answer it — all read-only against production.
- 1Wait Statistics
Established a baseline and compared snapshots across two weeks.
Signal: PAGEIOLATCH_SH dominated total wait time and was trending upward.
Wait Statistics: PAGEIOLATCH_SH dominating the wait profile. (Placeholder image.) - 2Query Statistics
Identified which statements generated the most physical reads.
Signal: One dashboard aggregation query scanned a large fact table on every load.
- 3Index Advisor
Evaluated a covering index and checked drop-safety / overlap with existing indexes.
Signal: A narrow covering index would convert the scan into a seek with no redundant index conflict.
Index Advisor: covering index recommendation with safety checks. (Placeholder image.)
Evidence
Recommendation
Add one narrow covering index that matches the dashboard query predicate and included columns, eliminating the repeated table scan and the IO waits it generated.
- Create the covering index suggested by Index Advisor (predicate keys + included output columns).
- Validate the new seek plan in Query Statistics after the next dashboard load.
- Re-baseline Wait Statistics to confirm PAGEIOLATCH falls and stays down.
-- Review Index Advisor output before applying; size and write impact matter. CREATE NONCLUSTERED INDEX IX_FactSales_DashboardCover ON dbo.FactSales (ProductKey, OrderDateKey) INCLUDE (SalesAmount, Quantity) WITH (ONLINE = ON, DATA_COMPRESSION = PAGE);
Outcome
The covering index turned the scan into a seek. PAGEIOLATCH waits dropped sharply and dashboard latency stabilized even as data kept growing.