Skip to main content
Microsoft Fabric

Fabric Capacity Optimisation: Reduce Cost, Improve Performance and Scale Smarter

A bigger Fabric SKU hides architectural problems; it rarely fixes them. A practitioner's guide to Capacity Units, workload management, Power BI, Spark and Data Factory — so you optimise before you scale.

Amit Kumar Singh - Technology Consulting Partner at MyData Insights

Technology Consulting Partner · MyData Insights

14+ years in industrial data · Former Accenture & EY · India, GCC, SEA

16 August 2026 · 15 min read

The bottom line

A bigger Fabric SKU hides architectural problems; it rarely fixes them. Capacity optimisation is ongoing work across sizing, workload analysis, Power BI and Spark performance, refresh scheduling, concurrency, governance and monitoring — measured in the Capacity Metrics app. Before you scale, find what is consuming your Capacity Units, why, and whether it can be optimised or rescheduled. Optimise first, scale second.

Choosing the right SKU is where optimisation starts, not ends

Microsoft Fabric brings data engineering, integration, warehousing, real-time analytics, data science and Power BI onto one platform. After the migration, most teams make the same mistake: they pick a capacity SKU and assume capacity optimisation is done.

It is not. A larger Fabric capacity hides architectural problems. A smaller one exposes them as slow reports and failed refreshes when workloads are poorly scheduled or inefficiently built. Capacity optimisation is an ongoing combination of architecture, workload management, performance engineering, monitoring and cost governance.

For an estate running Power BI, Lakehouses, Warehouses, Data Factory, Spark and Dataflows Gen2, the objective is simple to state and hard to earn: get the maximum business value from every Capacity Unit.

What Fabric capacity optimisation actually is

A Fabric capacity is a pool of compute measured in Capacity Units (CUs). The Fabric Capacity Metrics app lets administrators watch consumption and judge whether a capacity is sized right or needs scaling.

Optimisation is the continuous work of improving capacity utilisation, workload performance, CU consumption, Power BI performance, pipeline efficiency, Spark and Warehouse workloads, semantic-model performance, refresh schedules, concurrency, sizing and cost.

The aim is not the lowest possible utilisation. It is the right balance between performance, reliability and cost — reducing cost while making Power BI unusably slow is not optimisation.

Why it matters: the "just increase the SKU" reflex

Picture an estate with 100+ semantic models, 300+ reports, several Lakehouses, Data Factory pipelines, Dataflows Gen2, Spark notebooks, Warehouses and Direct Lake models. It all works — until the complaints start: the dashboard is slow, the refresh failed, the report takes 30 seconds to open, the pipeline is late, we are being throttled.

The first reaction is usually "increase the capacity". Sometimes that is right. More often the real problem is poor workload distribution, inefficient data models, needless refreshes and badly designed transformations — and a bigger SKU only postpones it.

The Capacity Metrics app exists precisely to identify the workloads and time periods driving CU consumption before you decide to scale. That turns the question from "why is Fabric expensive?" into "which workloads are consuming the most CUs?"

A larger capacity does not fix an inefficient workload. It just pays for it at a higher rate.

Capacity Units and the F SKUs

Fabric capacity is measured in Capacity Units. The F SKUs map to CUs on a simple scale.

SKUCapacity Units
F22 CU
F44 CU
F88 CU
F1616 CU
F3232 CU
F6464 CU
F128128 CU
F256256 CU
F512512 CU
F10241,024 CU

Microsoft recommends sizing from the actual workload — using the Capacity Metrics app and, where relevant, the Fabric SKU Estimator — rather than picking a capacity from theoretical sizing or a user count. Capacity sizing should be driven by workload behaviour, not by the number of people with a login.

One capacity, many workloads

The concept that catches teams out: multiple Fabric workloads draw on the same capacity. Power BI semantic models, report queries and refreshes; Data Factory pipelines and dataflows; Data Engineering notebooks and Spark jobs; Warehouse SQL and loading; Real-Time Intelligence eventstreams — all share the pool.

So optimising Power BI alone may not fix a capacity problem. A report can be slow because a large Spark job or a background refresh is consuming capacity at the same moment.

Microsoft classifies operations broadly as interactive or background. Interactive covers user-driven report queries; background covers activities such as semantic-model and dataflow refreshes. When users complain about slow reports but the pressure comes from a background Spark workload, more capacity is the wrong first move.

Start with sizing: right-sized, not bigger

The first question is "do we have the right-sized capacity?" — not "should we buy a larger one?" There is a real difference.

The common sizing mistakes are familiar: over-provisioning from day one, under-provisioning on optimistic estimates, sizing only for average usage, ignoring peaks, ignoring background processing, ignoring growth, and using user count as the primary factor.

A better sequence is measure, analyse, optimise, size, validate — using observed utilisation from the Capacity Metrics app, not a theoretical estimate. Create or use a trial capacity, review utilisation, identify the timepoints that matter, and scale on demonstrated demand.

Find your biggest CU consumers

This is where the Capacity Metrics app earns its keep. Microsoft's troubleshooting guidance is to identify the highest CU-consuming items over the previous 14 days, drill into specific time periods, then analyse the trend to decide the action.

Look for the top-consuming workspaces, items and operations; peak periods; long-running operations; repeated refreshes; heavy notebooks; and expensive SQL queries. That single shift — from guesswork to evidence — is what turns capacity management into engineering.

The Compute page gives a 14-day view that surfaces usage patterns, peak loads and overloaded periods, with usage data generally available after around 10–15 minutes of processing latency.

Optimise Power BI — models and refreshes

Power BI is often the most visible workload, and a poorly designed semantic model quietly burns capacity. Review model size, column count, high-cardinality columns, calculated columns, DAX complexity, relationships, many-to-many and bi-directional filtering, unnecessary tables, duplicate dimensions, aggregations and storage mode.

The question to keep asking: does the model contain everything the report needs, or everything the source system contains? Importing entire ERP tables when a report needs a handful of columns and rows is the classic anti-pattern.

Refresh frequency matters just as much. A model refreshed every 30 minutes when the data changes once a day is waste. Match refresh to the business latency requirement — use incremental refresh, sensible windows and controlled concurrency so only changed partitions are processed. Refresh when the business needs fresh data, not because a schedule exists.

Optimise Data Factory and Spark

Data integration is another big source of avoidable consumption. Review pipeline frequency, full versus incremental loads, copy-activity design, transformation logic, redundant pipelines, duplicate source extraction, retry policies, parallelism and dependency chains. The single biggest win is usually replacing a full load with an incremental one where the source supports it — processing 25,000 changed records a night instead of re-reading a billion.

Spark workloads can become major consumers. Review notebook execution time, cluster configuration, partitioning, file sizes, join strategies, data skew, repeated transformations, caching, shuffle operations and the small-file problem. The anti-pattern is read-everything, transform-everything, write-everything when only a fraction of records changed; the better design is incremental ingestion, incremental transformation and optimised Delta tables.

Fabric's autoscale monitoring for Spark also lets you see which Spark workloads triggered autoscaling and how they contributed to capacity usage — useful evidence when a background job is the real cost driver.

Smoothing, throttling and concurrency

A capacity can run comfortably all day and then buckle in one window when too many workloads overlap — refreshes, ERP ingestion, Spark transformation and executive reports all firing at once. Scheduling is therefore part of optimisation: stagger ingestion, transformation and refresh through the small hours so BI is ready for the working day, and flatten the unnecessary peaks.

Fabric also smooths compute — spreading evaluation over time rather than treating every spike as an immediate capacity requirement. So a short utilisation spike does not automatically mean you need a larger capacity; you need to know how long it lasts, what caused it, whether it throttles, whether it hits interactive users, and whether it recurs.

When workloads do reach the limit, Microsoft's metrics identify distinct throttling scenarios across different evaluation windows: interactive delay (reports respond slowly), interactive rejection (requests error out), and background rejection (refreshes are rejected). The distinction matters — if reports are slow but a background Spark job is the consumer, the fix is to optimise and reschedule that job, not to resize.

Separate workloads and build governance

One architectural lever is whether everything should share a capacity. Splitting enterprise BI, data engineering and advanced-analytics workloads onto separate capacities is not automatically cheaper, but it can improve performance isolation, governance, cost allocation, troubleshooting and business prioritisation. The right design depends on workload characteristics and organisational need.

Optimisation should not live only with the Fabric administrator — it belongs in the data-platform operating model. Define ownership (who owns each workload), development standards, the metrics you review, the thresholds that trigger investigation, the escalation point for resizing, cost allocation by business unit, and a lifecycle for retiring unused workloads.

That last point is easy to miss: unused semantic models, reports, pipelines, notebooks and dataflows still add complexity and can generate needless background activity. A regular Fabric workload cleanup belongs in governance.

A structured optimisation framework

The work is repeatable. We run it as six steps, each feeding the next.

  • Discover — inventory capacities, workspaces, workloads, semantic models, pipelines, notebooks and Warehouses
  • Measure — analyse CU consumption, utilisation, peak periods, throttling and top consumers
  • Diagnose — find inefficient workloads, duplicate processing, excessive refresh, poor data models and capacity contention
  • Optimise — improve Power BI models and DAX, pipelines, Spark, SQL, refresh schedules and data architecture
  • Govern — set standards, ownership, monitoring, thresholds, cost allocation and lifecycle
  • Scale — only after optimising: resize, autoscale where appropriate, then re-measure

Keep a simple before-and-after tracker so every change proves its worth.

OptimisationBeforeAfterImprovement
Semantic model120 CU75 CU37.5%
Pipeline80 CU45 CU43.8%
Notebook150 CU90 CU40%
Refresh workload100 CU55 CU45%

The figures vary by workload; the discipline is what matters — measure before versus after, every time.

When to actually scale

Scaling is the right move when workloads are already optimised, demand is genuinely growing, capacity pressure is persistent, interactive performance requirements are rising, concurrency is consistently high, and the workloads cannot reasonably be moved or rescheduled. The principle: optimise first, scale second — not always, but often.

The F SKUs support on-demand resizing and pause/resume, with specific autoscale capabilities varying by workload and SKU. For predictable peaks, proactive scaling helps — run F64 on normal days, step up to F128 for month-end processing, then back to F64. Microsoft documents scheduled resizing for predictable surges using automation such as the Fabric CLI, Azure Automation or the Fabric REST APIs.

The point is to model the economics rather than run the largest capacity all the time to paper over a workload you have not looked at.

A manufacturing capacity pattern

For manufacturers, capacity optimisation matters more because the workloads have very different shapes through the day. ERP incremental ingestion overnight, MES processing, IoT transformation and production aggregation in the small hours, a semantic-model refresh before dawn, plant dashboards live from 07:00, interactive Power BI through the shift, daily production processing in the evening — and month-end when finance, inventory and production workloads all climb together.

The capacity has to carry both background engineering and interactive business workloads without them fighting each other. A well-designed schedule — heavy engineering off-peak, BI ready for the shift — reduces the contention that makes a capacity look undersized when it is really just badly timed.

The bottom line: three objectives, not one

Capacity optimisation is not only about cost. There are three objectives, and you need all of them: cost (are we spending the right amount?), performance (are users getting the response times they need?) and capacity (are we using the compute efficiently?). Buying a huge capacity to erase every performance issue is no more "optimised" than starving it to cut the bill.

A mature team does not just read "utilisation = 72%". It knows which workload consumed it, why, when, whether it was necessary, whether users were affected, whether it can be optimised, and whether it should be rescheduled or resized. The conversation shifts from "we need a bigger capacity" to "our Spark job is generating 40% of background CU in the same window as the executive model refresh — let's optimise and reschedule before resizing". That is capacity engineering.

Fabric gives you a powerful unified platform. It does not optimise itself. Before you assume you need more, ask what is consuming the capacity, why, whether the workload can be optimised, whether it can run at a different time, whether the architecture can be redesigned — and only then, whether you need more.

Understand it. Optimise it. Govern it. Then scale it. In that order.

The fastest way to know whether you have a capacity problem or a workload problem is to open the Capacity Metrics app and read the last 14 days — which workspace, which item, which window. That is a 30-minute conversation, not a procurement decision. Book a Fabric capacity assessment with Amit — no slides, no pitch deck, no obligation to proceed. Most teams leave knowing exactly what to optimise before they spend another rupee on a bigger SKU.

Free Assessment

Where does your operation sit on the data maturity curve?

8 questions. 3 minutes. You get a scored breakdown across data infrastructure, analytics readiness, and automation potential — with a specific next step for your industry.

Microsoft FabricPower BICost OptimisationCapacityPerformance

Your Data · Our Technology · Our Automation

Get practical insights every fortnight

Amit writes about Microsoft Fabric, Power BI, AI in operations, and digital transformation for manufacturing and supply chain leaders. Practitioner perspective - no fluff, no vendor spin.

No spam. Unsubscribe any time. Also on Substack.

FAQ

Common questions

What is Fabric capacity optimisation?

It is the ongoing work of monitoring and improving how Microsoft Fabric workloads consume Capacity Units, to balance performance, reliability and cost — not simply to reduce consumption.

How do I know if my Fabric capacity is too small?

Look beyond average utilisation. Review peak consumption, throttling, interactive delays or rejections, background rejections, and the specific workloads driving usage — using the Capacity Metrics app, which surfaces a 14-day view of consumption.

Should I increase my Fabric capacity when utilisation is high?

Not automatically. First check whether inefficient semantic models, refresh schedules, Spark jobs or pipelines are creating avoidable consumption. If workloads are already optimised and demand is persistently high, scaling may be right.

What is the Fabric Capacity Metrics app?

It is Microsoft’s monitoring application for analysing Fabric capacity consumption, utilisation, throttling and workload behaviour — the primary place to decide whether to optimise workloads, resize capacity or use supported scaling options.

What are Capacity Units in Fabric?

Capacity Units (CUs) are the compute measurement used by Fabric capacities. Different F SKUs provide different amounts of CU — for example F64 provides 64 CU. Microsoft recommends sizing from observed workload rather than user count.

Can Fabric capacity be optimised without hurting performance?

Yes. The goal is to remove unnecessary consumption — needless refreshes, full loads, inefficient models and jobs — while maintaining or improving the performance the business actually needs.

Is this the challenge you're facing?

Book a 30-minute call. We'll look at your specific operation and tell you what's achievable - plainly and without slides.