The symptoms arrive from users, not dashboards: reports spin, visuals time out, exports fail with capacity errors. The report gets the blame, but the cause is the capacity — something, somewhere on it, spent more compute than the SKU provides, and Fabric began defending itself. That defense is throttling, and it follows documented mechanics worth actually knowing.
Smoothing and burndown
Fabric never bills an operation at the instant it runs. Interactive operations are smoothed over a short window (minutes); background operations — refreshes, dataflows, notebooks — over 24 hours. When smoothed consumption exceeds the capacity’s CU budget, the excess is borrowed from future capacity (carryforward) and must be paid back — burned down — before the capacity is healthy again. Throttling severity is a function of how much future capacity you have already spent.
The throttling ladder
- Under 10 minutes of future capacity consumed: overage protection — no throttling, the debt just burns down.
- 10 minutes to 1 hour: Interactive Delay — user-facing queries are artificially delayed (roughly 20 seconds); reports feel sluggish.
- 1 to 24 hours: Interactive Rejection — user queries are refused outright; background jobs still run.
- Beyond 24 hours: Background Rejection — everything is refused, including refreshes. The capacity is effectively down.
Finding the offender
Diagnosis is a ranking exercise: per-item, per-operation CU consumption around the throttling window, split interactive vs background. The usual culprits, in order of frequency: scheduled refreshes piled onto the same hour, a runaway dataflow or notebook, one oversized semantic model doing full loads, and genuine interactive load growth. The Capacity Metrics app holds this detail — for about 14 days, which is fine for yesterday’s incident and useless for "this keeps happening every month-end".
Fix patterns
- Spread refresh schedules — the 08:00 pile-up is the most common self-inflicted throttle.
- Convert heavy full refreshes to incremental.
- Retire zombie datasets that refresh for nobody.
- Isolate dev/test and heavy engineering workloads from the reporting capacity.
- Only then consider the next SKU — see the FinOps guide before doubling the bill.
Per-item history, kept long enough to matter
PGR Sonar stores timepoint-level capacity consumption per item and operation as long-term history, so throttling forensics work over months: what the utilization looked like around any past incident, which items dominate month after month, and whether the fix actually held. Capacity Diagnostics turns the same data into concrete recommendations — the specific datasets, dataflows or notebooks to reschedule or optimize before the next incident.