Covering index on a write pathHealthcare provider group, anonymized × red9CS-0252
An order-activity path running 26,223 times a day cut its daily reads from 42.4 million to 340,899
The problem. A healthcare provider group had an order-activity statement executing about 26,223 times a day. Each run averaged 8.13 ms and 1,617 disk-IO units, which added up to roughly 42.4 million reads a day on a path that sits directly in front of clinical users.
What we did. We captured the plan and Query Store history, then designed a covering index keyed on the three columns the statement filters, with the three output columns included so the engine never leaves the index. Create and rollback scripts went over together for the client to apply, and before-and-after readings came from the same window.
Red9 · Performance Impact
Reads per day
124x
42,402,591 down to 340,899 at the same volume.
Per-run duration
116x
8.13 ms down to 0.07 ms.
Processor time, per run
120x less
7.22 ms of CPU down to 0.06 ms on a statement that fires every three seconds.
Duration
8.13 ms → 0.07 ms
116x shorter
Reads / day
42.4M → 340,899
124x fewer
Executions
~26,223 / day
unchanged
Order-activity path
duration, per run
How to read these. The 116x is 8.13 ms over 0.07 ms per run; the 124x is 1,617 disk-IO units over 13, which at ~26,223 runs a day is 42,402,591 reads down to 340,899. The group recorded all of it in Query Store, before the index and after.
The result. A statement running roughly every three seconds now costs 0.07 ms and 13 disk-IO units instead of 8.13 ms and 1,617. Daily read volume fell by about 42 million pages, which took the pressure off the clinical workload sharing that instance.
The technical detail
What the review found. The statement filtered an order-activity table on a record identifier plus two status columns, with no index matching that combination, so each of the ~26,223 daily executions paid for a scan and then a lookup for the columns it returned.
What we changed (identifiers generalized for privacy):
-- Order-activity path: ~26,223x/day, 8.13 ms avg, ~42.4M reads/day.
CREATE NONCLUSTERED INDEX IX_orderActivity_MRN_Red9
ON dbo.[orderActivity] (recordId, activeInd, orderStatus)
INCLUDE (id, linkedOrders, orderItem);
-- rollback: DROP INDEX IX_orderActivity_MRN_Red9 provided
With the output columns included, the engine answers from the index alone: 0.07 ms a run, 13 disk-IO units, and 340,899 reads a day instead of 42.4 million.