DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Newsletter
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • Improving Repeated Analytics Workloads With Databricks Disk Cache
  • How We Rebuilt a Legacy HBase + Elasticsearch System Using Apache Iceberg, Spark, Trino, and Doris
  • Data Processing With Python: Choosing Between MPI and Spark
  • Snowflake vs. Databricks: How to Choose the Right Data Platform

Trending

  • OpenCode: Setting Up an Open-Source AI Coding Assistant
  • Data Integration Landscape 2026: Event Streaming, API, and Batch in the Era of Agentic AI
  • How to Keep AI Agents From Going Rogue Using Docker Sandbox
  • PostgreSQL vs Oracle: When Higher Cost Means Better Performance

Draft This article hasn't been published, so readers can't see it.

In moderation This article is waiting for review, so readers can't see it yet.

Deleted This article has been deleted, so readers can't see it.

  1. DZone
  2. Data Engineering
  3. Big Data
  4. Microsoft Fabric Throttling: Diagnose Before You Scale

Microsoft Fabric Throttling: Diagnose Before You Scale

Learn how to diagnose Microsoft Fabric capacity throttling, identify expensive workloads, optimize CU consumption, and decide when scaling is necessary.

By 
Amrutha Satishkumar
·
Oct. 28, 26 · Analysis
Post on X (opens in a new tab) Share on LinkedIn (opens in a new tab)
217 Views

Join the DZone community Save articles, join the discussion, and download Refcards and Trend Reports with a free account.

Join for free Already a member? Log in

If Your Fabric Capacity Is Throttling, Do Not Start With the SKU

A report takes twenty seconds to open. A pipeline that normally finishes before breakfast is still running. Someone sees the capacity above 100% and proposes the obvious fix: move from F64 to F128.

That might be the right decision. It should not be the first one.

Microsoft Fabric brings data engineering, warehousing, real-time analytics, data science, and Power BI onto shared capacity. That is one of its strengths. It also means one inefficient item can consume compute that another workload needs. A poorly shaped warehouse query, an oversized Spark session, an hourly refresh of data that changes once a day, or a report page with too many expensive visuals can all surface as the same complaint: “Fabric is slow.”

The complaint does not tell you the cause.

The useful operating model is:

Confirm the capacity is throttling. Isolate the operation creating pressure. Optimize that workload. Scale only when the remaining demand is legitimate.

This distinction matters because a larger SKU gives inefficient work more room to run. It does not make the work efficient.

First, Separate Slow Performance From Throttling

Slow performance and capacity throttling can look similar to a user, but they are different problems.

A report visual can be slow because its DAX is expensive. A warehouse query can be slow because it scans far more data than it needs. A Spark job can wait because it requested more executors than are available. Network latency, gateway pressure, cold cache, locks, and source-system performance can also add delay.

Throttling is more specific. It happens when billable operations consume more Capacity Unit seconds than the capacity can supply, including the future capacity Fabric uses to absorb smoothed usage. When that budget is exhausted, Fabric progressively delays or rejects new work.

This leads to the first rule:

Do not diagnose throttling from a slow screen or a utilization spike. Confirm it in the Capacity Metrics app.

Microsoft explicitly notes that utilization above 100% does not immediately mean throttling. Fabric allows bursting, smooths usage, and provides limited overage protection before user operations are affected.

Use the Throttling view and System events on the Compute page to confirm whether the capacity entered interactive delay, interactive rejection, or background rejection. Rejected requests can also surface errors such as CapacityLimitExceeded.

If the app shows no throttling during the incident, investigate the item itself. Buying capacity to fix a bad query is an expensive way to avoid reading its execution plan.

What Fabric Is Protecting You From

Fabric does not force every operation to fit inside the CU budget of the current second. It uses two mechanisms to absorb variability.

Bursting lets an operation temporarily use more compute than the provisioned SKU provides so it can finish quickly.

Smoothing spreads the CU accounting for that operation across future 30-second timepoints. Interactive operations are typically smoothed over five to 64 minutes, depending on consumption. Background operations are typically smoothed over 24 hours.

Smoothing is not a performance optimization. It does not make a query cheaper or slow a job down to fit the capacity. It changes how consumed compute is applied against the capacity limits.

When smoothed usage continues to accumulate faster than idle capacity can pay it down, Fabric moves through progressive protection stages:

Future capacity consumed Protection stage User impact
Up to 10 minutes Overage protection New operations continue without throttling
More than 10 minutes, up to 60 minutes Interactive delay New interactive operations receive a 20-second submission delay
More than 60 minutes, up to 24 hours Interactive rejection New interactive operations are rejected
More than 24 hours Background rejection New interactive and background operations are rejected


Operations already running are allowed to complete. The capacity recovers when unused CUs burn down the accumulated carryforward.

That delayed accounting explains a common mystery. The item users see failing at 10:00 AM might not be the item that created the pressure at 10:00 AM. A large background operation completed earlier can still be consuming future capacity through smoothing.

Diagnose From the Capacity Down, Not From the complaint up

When a capacity incident occurs, use the same investigation path every time.

1. Pin Down the Affected Window

Record the time, capacity, workspace, reported symptom, and whether the failure affected interactive work, background work, or both. Do not begin with a full month of data. Start with the narrowest window that contains the incident.

The Capacity Metrics app shows the previous 14 days of compute usage and displays hourly usage in the multimetric ribbon. Select the affected day and hour. When filters are applied, the utilization and throttling visuals can show 30-second timepoints rather than only periodic peaks.

2. Confirm the Protection Stage

Open the Throttling tab and check which threshold crossed 100%:

  • Interactive delay means the capacity consumed more than 10 minutes of future capacity.
  • Interactive rejection means it consumed more than 60 minutes.
  • Background rejection means it consumed more than 24 hours.

Then review Overage (Carryforward). The add, burndown, and cumulative values tell you whether the capacity experienced a short surge that quickly recovered or sustained demand that kept adding debt.

Minutes to burndown is especially useful. It estimates how long recovery would take if no new operations entered the capacity.

3. Find the Items That Consumed the CUs

In the matrix by item and operation, sort by CU(s) for the selected window. Expand the highest consumers to see the operation type. Duration alone is not enough. A long-running operation can use modest compute, while a short burst can consume many CUs.

Add the optional columns that help explain the incident:

  • Rejected count
  • Failed count
  • Successful count
  • In-progress count
  • Overloaded minutes
  • Item size
  • Performance delta

Hovering over matrix values exposes the operation-level breakdown. Capture the workspace, item, operation, user or service principal, CU seconds, operation count, and time.

4. Classify the Shape of the Problem

Most incidents fall into one of four patterns:

Pattern What the evidence looks like Likely response
One expensive operation A single run dominates CU seconds Optimize code, query, model, or data layout
Excessive frequency A modest operation runs far more often than its data changes Reduce refresh or execution frequency
High concurrency Many acceptable operations overlap Control concurrency, isolate workloads, or scale
Sustained business demand Optimized work remains consistently high Scale up or scale out


This classification prevents random tuning. It tells you whether to reduce cost per operation, reduce operation count, change where the work runs, or provide more compute.

Reducing frequency and rescheduling are not the same optimization. Changing an hourly refresh to a daily refresh removes unnecessary executions and lowers total consumption. Moving the same 24 hourly refreshes to a different part of the day does not make them cheaper. It only changes when they compete with other work.

Optimize the Workload That Actually Caused the Pressure

Fabric workloads share capacity, but they do not share one tuning playbook. Once you know which operation consumed the CUs, focus on that workload instead of trying to optimize everything.

Warehouse and SQL Analytics Endpoint

Start with Query Insights to identify completed queries using the most CPU. Microsoft's Query Insights documentation includes this query:

SQL
 
SELECT TOP 100
    distributed_statement_id,
    query_hash,
    allocated_cpu_time_ms,
    label,
    command
FROM queryinsights.exec_requests_history
ORDER BY allocated_cpu_time_ms DESC;


If a query stands out, check how much data it scans, whether filters are applied early, and whether joins or statistics need attention. Compare repeated executions, not just the first run, because cold starts can distort the picture. The goal is fewer resources consumed for the same result, not simply a faster first response.

Spark, Notebooks, and Lakehouse Processing

Use Spark monitoring and the Tune tab to look for heavy shuffles, skewed stages, spills, or executors that sit underused. Filter data early, avoid repeated actions, and review Delta file layout when small files become a recurring problem. Also check session lifetime. Leaving compute running after the work is done is easy to overlook.

If bursty Spark workloads regularly compete with reporting, consider whether separately billed on-demand Spark is a better fit. Measure the cost and isolation trade-off before making the switch.

Data Factory Pipelines and Dataflow Gen2

A pipeline can orchestrate several expensive operations, so the pipeline itself may not be where the CUs are going. Check the notebook, copy, refresh, or transformation activity behind it. The simplest savings often come from removing unnecessary runs, using incremental loads, and preserving query folding in Dataflow Gen2 where supported.

Moving the same work to another hour might reduce contention, but it does not reduce total CU consumption. Removing work you do not need does.

Power BI Semantic Models and Reports

Separate refresh pressure from interactive report pressure. For refreshes, focus on incremental processing, folding, and schedules that match how often the source changes. For reports, use Performance Analyzer to find expensive visuals and DAX measures, then compare those findings with the semantic model's operations in Capacity Metrics.

A page with too many costly visuals can feel like a capacity problem even when the better fix is in the report design.

Real-Time Intelligence

For KQL databases and Eventhouses, inspect wide queries, repeated aggregations, retention and caching choices, and ingestion patterns. Limit scans to the data actually needed and consider pre-aggregation when queries repeatedly calculate the same result.

Keep the freshness requirement in view. Lower CU consumption is not a win if the data now arrives too late to be useful. Real-Time Intelligence also has different throttling behavior, so do not assume every workload uses the same interactive delay stage.

Reduce Blast Radius When Optimization Is Not Enough

Some workloads are efficient and still should not share a failure boundary.

An executive reporting estate, a self-service experimentation workspace, and a large overnight engineering platform can have different service expectations. If one workload is allowed to consume the headroom needed by another, the architecture is coupling them operationally even if their data products are separate.

Fabric gives you several options:

  • Scale up when optimized demand legitimately exceeds the current SKU.
  • Scale out by moving workspaces to another capacity when isolation, administration, or service levels differ. This adds capacity cost and operational ownership, so the service-level benefit must justify it.
  • Use on-demand billing for Spark when dynamic Spark demand should not consume the shared capacity.
  • Configure surge protection to limit the background compute that can consume capacity and make interactive throttling less likely.
  • Enable capacity overage billing when continuity is worth the additional cost and the feature fits your operating model. Microsoft documents overage billing at three times the normal capacity rate, so estimate the cost first.

Surge protection is a guardrail, not free capacity. When it activates, background jobs can be rejected. Microsoft recommends correctly sizing and isolating critical solutions rather than treating surge protection as a replacement for optimization or capacity design.

Prove That the Optimization Worked

A workload is not optimized because its code changed or one test completed faster. Compare the same business operation before and after the change.

Track:

Measure Why it matters
CU seconds per operation Shows whether the work became cheaper
Operation count Exposes unnecessary frequency and retries
Total CU seconds Shows the net capacity effect
Duration Measures user or batch completion time
Data scanned Reveals pruning, cache, and query-shape improvements
Rejected and failed count Confirms whether capacity pressure still disrupts work
Carryforward and minutes to burndown Shows whether the capacity recovers faster
Interactive latency Confirms that users experience the improvement


Run the comparison over a representative period. A change that improves one query but shifts expensive work into refresh, maintenance, or another engine is not an end-to-end optimization.

For recurring operations, calculate both cost per run and daily cost:

Plain Text
 
Daily CU-seconds = CU-seconds per operation × operations per day


Reducing a query from 1,000 to 800 CU seconds saves 20% per run. If it runs ten times more often after the redesign, total consumption still increases substantially. Efficiency and frequency belong in the same calculation.

A Practical Throttling Response Worksheet

Use this during the next capacity incident:

Plain Text
 
Incident window:
Capacity and SKU:
User-visible symptom:
Confirmed throttling stage:
Carryforward and minutes to burndown:

Top workspace:
Top item:
Top operation:
Interactive or background:
CU-seconds:
Operation count:
Rejected count:

Problem shape:
[ ] One expensive operation
[ ] Excessive frequency
[ ] High concurrency
[ ] Sustained business demand

Optimization applied:
Before CU-seconds per operation:
After CU-seconds per operation:
Before daily CU-seconds:
After daily CU-seconds:
Problem shifted to refresh, maintenance, or another engine:

Decision:
[ ] Keep current SKU
[ ] Scale up
[ ] Isolate on another capacity
[ ] Move Spark to on-demand billing
[ ] Add a protective capacity control


This turns a vague performance complaint into a traceable engineering decision.

The Goal Is Not Zero Utilization

A well-used Fabric capacity should do work. The goal is not to keep every chart comfortably low or eliminate every temporary excursion above 100%.

The goal is to ensure that each operation earns the compute it consumes, critical workloads retain the service level they need, and sustained business demand fits inside a deliberate capacity envelope.

When throttling appears, ask these questions in order:

  1. Did the capacity actually throttle, or is one item simply slow?
  2. Which item and operation consumed the CUs?
  3. Is the problem cost per operation, frequency, concurrency, or real growth?
  4. Can the workload be made cheaper without reducing the business outcome?
  5. If not, should the answer be more capacity or better isolation?

That is the difference between reacting to throttling and operating Fabric well.

Sources

This article is grounded in current Microsoft documentation. Product behavior and preview features can change, so verify the latest guidance before making production capacity decisions.

  • Understand capacity throttling and smoothing (Microsoft Learn)
  • Capacity Metrics app compute page (Microsoft Learn)
  • Evaluate and optimize your Microsoft Fabric capacity (Microsoft Learn)
  • Performance guidelines for Fabric Data Warehouse (Microsoft Learn)
  • Query Insights in Fabric Data Warehouse (Microsoft Learn)
  • On-demand billing for Apache Spark in Microsoft Fabric (Microsoft Learn)
  • Optimization guide for Power BI (Microsoft Learn)
  • Manage surge protection for Fabric capacities (Microsoft Learn)
  • Data clustering in Fabric Data Warehouse (preview) (Microsoft Learn)
  • Partitioning for Delta tables (Microsoft Learn)
Apache Spark Data science

Published at DZone with permission of Amrutha Satishkumar. See the original article here.

Opinions expressed by DZone contributors are their own.

Related

  • Improving Repeated Analytics Workloads With Databricks Disk Cache
  • How We Rebuilt a Legacy HBase + Elasticsearch System Using Apache Iceberg, Spark, Trino, and Doris
  • Data Processing With Python: Choosing Between MPI and Spark
  • Snowflake vs. Databricks: How to Choose the Right Data Platform

Partner Resources

×

Comments

Loading comments

The comments didn't load

Please try again in a moment.

Likes

Loading

The next likes didn't load. Please try again.

The likes didn't load

Please try again in a moment.

See who liked this

Log in or join DZone for free to see who liked this article.

Log in Join for free
  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook