How Fabric Throttling Actually Works
Fabric throttling means your capacity has sustained too much Compute Unit (CU) consumption for too long — even after Microsoft's built-in "smoothing" spreads spiky jobs out over time — and the platform starts delaying, then rejecting, new work to protect itself. It is almost never one report being "too big" in isolation; it is total demand on the capacity (refreshes, notebooks, DAX, dataflows) exceeding what the SKU can absorb once smoothing runs its course.
Fabric doesn't throttle the instant your capacity crosses 100% utilization. Two mechanisms — bursting and smoothing — exist specifically so a temporary spike doesn't ruin anyone's day. Bursting lets an operation temporarily use more CUs than your SKU technically provides, so jobs finish fast. Smoothing then spreads that borrowed CU usage across future 30-second "timepoints" so no single moment gets charged the full cost. Interactive operations (a user clicking a report visual, running a DAX query) are smoothed over 5 to 64 minutes depending on size; background operations (pipeline runs, dataflow refreshes, most warehouse queries, Spark jobs) are smoothed over a full 24 hours, because they tend to be long-running and CU-heavy.
That smoothing is generous. Microsoft's own worked example: a single background job that burns 1 CU-hour on an F2 capacity contributes only about 2.1% to any individual timepoint's utilization once spread across 2,880 daily timepoints — even though it used six times the CUs available in the very next 10-minute window. That's why one heavy notebook run rarely throttles a whole capacity by itself; it usually takes sustained, overlapping demand across many jobs and reports to actually exhaust future capacity.
When it does get exhausted, throttling proceeds in three escalating stages, not one on/off switch:
| Stage | Trigger | What Users Experience |
|---|---|---|
| Overage protection | Capacity has consumed its next 10 minutes of future CU capacity | Nothing yet — this window absorbs short spikes for free |
| 1. Interactive delay | 10–60 min of future capacity consumed | New interactive requests (report clicks, DAX queries) get a 20-second delay at submission |
| 2. Interactive rejection | 60 min–24 h of future capacity consumed | New interactive requests are rejected outright; background jobs can still start and run |
| 3. Background rejection | More than 24 hours of future capacity consumed | Everything — interactive and background — is rejected until "carryforward" CUs burn down |
Two classification details matter more than they get credit for. First, Fabric decides whether an operation is "interactive" or "background" at submission time, before it fully knows how the job will behave — in ambiguous cases it defaults to background, which is more forgiving to you. Second, almost all Warehouse category operations are classified as background specifically so they get 24-hour smoothing rather than triggering fast interactive throttling — which is exactly why a heavy SQL job can look "cheap" in the moment and still eat your smoothed capacity for the rest of the day. Real-Time Intelligence skips the 20-second interactive delay stage entirely and goes straight to the 60-minute rejection stage under load.
You'll see this show up in end-user terms as the error CapacityLimitExceeded, or "Your organization's Fabric compute capacity has exceeded its limits. Try again later," or "Cannot load model due to reaching capacity limits" — all documented rejection-stage symptoms, not vague slowness.
