Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
From a design perspective, every choice you make directly affects how the platform operates and how your users experience your solution. As an architect, your goal is to make the user and data flows predictable, efficient, and scalable.
This guide gives you best practices that you can apply through the lifecycle of your workload. Key concepts covered are: planning capacity, monitoring performance, testing, tuning for efficiency, and scaling confidently.
Plan capacity intentionally
Capacity planning in Microsoft Fabric determines how much compute is available to run your workloads and how effectively different workloads share those resources.
Fabric capacities provide compute resources measured in Capacity Units (CUs). Every operation, Spark jobs, SQL queries, pipeline activities, and Power BI refreshes, consumes CUs from the capacity that hosts the workload. If demand exceeds available compute, operations slow down, queue, or eventually trigger throttling.
A good starting point is the Microsoft Fabric Capacity Estimator, which provides an initial estimate of required CUs based on workload characteristics. However, estimates alone are rarely enough. The most reliable approach is to establish a baseline by deploying representative workloads on a trial or small Fabric capacity and monitoring how they behave in practice.
During this baseline phase, focus on metrics such as:
- CU consumption across workloads
- CPU and memory utilization (which can be monitored for certain workload types, but may be abstracted away for other workloads)
- Concurrency levels
- Response times for critical operations
Tools like the Fabric Capacity Metrics App help reveal usage patterns over time, including daily peaks and background processing activity. These patterns help you determine whether the capacity can handle sustained load or whether scaling or workload isolation is required.
Capacity planning must also account for service limits and quotas. Each Fabric SKU has defined constraints including total CUs, Spark vCore limits, memory availability, and throughput ceilings. If too many workloads run simultaneously, these limits can create contention.
One common mitigation strategy is workload isolation. Heavy jobs can be separated across workspaces or placed on different capacities. Note that capacity smoothing automatically distributes background workloads over a 24-hour period, which facilitates parallel task execution and eliminates the need to schedule heavy workloads during off-peak hours.
Dependencies can introduce performance bottlenecks as well. Many Fabric workloads rely on external systems or shared platform components such as:
- OneLake storage throughput
- External databases or APIs
- Network latency
- On-premises gateways
- Spark session configuration
These dependencies should be evaluated early in the design process because they often become the hidden constraint in otherwise well-sized architectures.
For larger solutions, isolating architectural layers across workspaces or capacities can reduce contention. For example, you might separate data preparation workloads, orchestration pipelines, and presentation workloads so one layer cannot starve another of compute resources.
Load testing and validation are critical. Simulate realistic workloads, gradually increasing data volumes and concurrency to identify performance breakpoints. Test across all workload types: Spark jobs, Power BI refreshes, and data integration pipelines. Monitor CU usage, throttling, and response times using the Fabric Capacity Metrics App. Keep in mind that Fabric smooths background operations over 24 hours, so short stress tests may not reflect sustained usage. Longer test windows may reveal issues that quick tests miss. Consider using Fabric Workspace Monitoring to collect logs and metrics from Fabric items during stress testing. Additional open-source monitoring tools are available in Fabric Toolbox.
Ongoing capacity management relies on continuous monitoring. Use the Fabric Capacity Metrics App, Workspace Monitoring, and workload-specific tools to track utilization trends, detect spikes, and identify bottlenecks. Incorporate real-time alerts or automated responses for proactive capacity management and regularly review telemetry from dependent components like pipelines or Spark jobs to refine scaling strategies.
Choose SKU and Tiers Based on Performance Requirements
Selecting the right Microsoft Fabric SKU determines how much compute and memory your workloads can use. Each capacity tier provides a fixed number of CUs, which affects concurrency limits, query throughput, and the responsiveness of interactive workloads.
Larger capacities provide more headroom for concurrency and memory-intensive workloads, but efficient architecture often matters more than raw capacity size. Even smaller SKUs can perform well when workloads are optimized, for example by pre-aggregating data in OneLake, enabling query folding in Power BI, and pushing heavy transformations into distributed Spark processing.
Design scaling strategies
Think about scaling in two dimensions. Vertical scaling increases the size of an individual capacity by upgrading to a larger SKU. This provides more compute, memory, and throughput for workloads that cannot easily be distributed across multiple environments, for example, a large semantic model supporting many concurrent users or a complex Spark pipeline.
Vertical scaling is typically fast and requires only a short pause while the capacity resizes.
Horizontal scaling, on the other hand, distributes workloads across multiple capacities. This approach works well when workloads are modular or when multiple teams operate independently. By assigning separate workspaces or solution components to different capacities, each workload receives dedicated compute resources and avoids contention with others.
Fabric's separation of compute and storage supports this model effectively. Data prepared in one capacity can be shared through OneLake without physically copying it, enabling architectures such as data mesh patterns where multiple domains publish and consume shared datasets.
As your architecture scales, maintain modular components wherever possible. Pipelines, datasets, warehouses, and analytical models should be able to scale independently.
Signals that it may be time to scale include:
- Consistently high CU utilization
- Slower interactive queries
- Increasing query latency
- Memory-related failures
When these signals appear, scaling decisions should be validated with testing. Simulate realistic workloads, measure response times, and confirm that partitioning or architectural changes reduce the amount of data each query must process.
Fabric features such as bursting, smoothing, capacity overage billing and autoscale billing can absorb short-term spikes in demand, but they should complement deliberate capacity planning rather than replace it.
Monitor performance issues
To keep your workloads running smoothly, you need visibility into the right metrics:
- Capacity utilization reveals how much of the available compute your workloads are consuming.
- Memory usage is another important signal, especially for Power BI semantic models and Spark jobs. Large models or inefficient queries can exhaust available memory and degrade performance across the capacity.
- Concurrency levels show how many operations are running simultaneously compared to the capacity's limits. High concurrency can increase queue times even when individual workloads are efficient.
- Job execution metrics, such as query duration, dataset refresh times, pipeline execution time, and Spark job runtime.
- Ingestion latency and event throughput per second are key indicators of system health for real-time workloads.
- Capacity-related errors and throttling events.
Fabric provides several tools that help monitor these signals. Use the Capacity Metrics App for a top-level view, the Real-Time Hub for Capacity Events for live monitoring of capacity-level events, and workspace/item-specific monitoring for detailed insight into Spark jobs, pipelines, and Semantic Models. Fabric lets you add custom tracking too - capture step durations or data processed if Fabric doesn't automatically provide it.
For deeper analysis, leverage Query Insights, DMVs, Spark UI, and Data Factory UI, and consider integrating logs with Azure Monitor or Log Analytics. Use threshold-based alerts and Fabric Activator to catch bottlenecks before they impact users. Always keep an eye on dependencies: external data sources, gateways, and network performance can become silent bottlenecks.
Focus only on issues that need action, like failures, extreme durations, or high capacity use that could cause throttling. Review your alerts regularly to reduce noise and avoid alert fatigue.
Do performance testing
Testing is how you validate that your design holds up in the real world. Testing is the only reliable way to confirm that your design behaves as expected under real workloads.
Performance tests should simulate realistic usage patterns rather than isolated operations. Tools such as JMeter or Locust can generate concurrent requests to measure system behavior under load, while benchmark queries such as TPC-H or TPC-DS can help evaluate analytical workloads.
Testing should include the same mixture of workloads expected in production. For example, if ingestion pipelines and analytical queries run at the same time in production, they should run simultaneously during testing.
The closer the test environment matches production, the more meaningful the results will be. Ideally, testing environments should use the same capacity size, region, and network configuration. Performance characteristics do not always scale linearly, so testing with realistic data volumes and concurrency levels is critical.
Capture detailed performance metrics during tests, including CU utilization, throughput, response time percentiles such as p95 and p99, and error rates. These metrics help identify whether performance issues are caused by capacity limits, inefficient queries, or external dependencies.
Even after deployment, lightweight continuous tests can help detect regressions early. For example, scheduled "heartbeat" queries can verify that response times remain within expected thresholds and alert operators if latency begins to increase.
Optimize performance
Query and transformation logic should also be optimized. Spark workloads benefit from well-defined partitions and parallel execution strategies. SQL queries perform better when filters and aggregations reduce the amount of data processed. For Power BI workloads, techniques such as incremental refresh, query folding, and aggregation tables reduce the amount of data that must be refreshed or queried.
Caching plays an important role in performance as well. Fabric uses multiple caching layers, including:
- OneLake local storage caches
- High-performance storage attached to compute nodes
- In-memory dataset caches
- Result-set caching for queries
Most caching capabilities are enabled automatically. Yet, some caching layers are configurable, such as defining data retention policies for real-time intelligence workloads. When tuned appropriately, caching can dramatically reduce query latency.
Fabric also includes platform features that support efficient execution. Autoscale and bursting can absorb temporary spikes in demand, while automatic statistics generation improves query optimization for analytical workloads.
Architectural patterns should align with workload behavior. Medallion architectures help manage data transformations efficiently, while event-driven pipelines reduce unnecessary processing. Data mesh architectures can distribute workloads across capacities while still enabling shared data access.