Share Seeing a “Resource Governing” error on your Power BI refresh? This failure often happens when there is not enough memory, even on a Fabric capacity like F8 or F16. This guide explains the true cause, including the “2x memory rule” for semantic models. We provide clear steps to fix the error, from model optimization to implementing incremental refresh and correctly testing your SKU. Monitor Memory to Fix Data Refresh in PowerBI & Fabric GigXP.com Fabric Power BI Azure Blog Monitor Memory to Fix Data Refresh in PowerBI & Fabric A practical guide to solving "Resource Governing" errors and correctly sizing your capacity. By the GigXP Tech Team | Updated: October 25, 2025 The "Resource Governing" Error Many Power BI and Fabric users encounter a "Resource Governing" error during a dataset refresh. This operation fails, and the error message is often confusing. You may see something similar to this: "Data source error: Resource Governing: This operation was cancelled because there wasn't enough memory... More details: consumed memory 805 MB, memory limit 134 MB, database size before command execution 2937 MB." The immediate question is: how can the operation consume 805 MB if the limit is only 134 MB? And why does a small F8 capacity fail when an F32 capacity works? The answer is that the "134 MB" limit is not the total capacity. It is the tiny amount of memory *headroom* remaining after your 2.9 GB model was already loaded. The error occurs because the refresh operation cannot fit into that small remaining space. Visualizing the Memory Limit Model in Memory 2.9 GB Limit F8 Capacity (3 GB Max Memory) Refresh Operation (805 MB) Fails to fit in 134 MB Headroom The Root Cause: The 2x Memory Rule A full semantic model refresh requires approximately double the memory of the final model size. This is because the system must keep the *old* model in memory to serve user queries while it simultaneously builds the *new* model. Required Refresh Memory ≈ (Final Model Size) x 2 Example: (2.9 GB Model) x 2 = 5.8 GB Required Memory Choosing the Right Fabric SKU This 5.8 GB requirement explains why the F8 SKU failed. Looking at the official memory limits, F8 (3 GB) and F16 (5 GB) are both too small for this full refresh. The F32 (10 GB) has enough memory, which is why it succeeded. SKU Max Memory (LSM Models) Query Limit Refresh Status (for 5.8 GB) F8 3 GB 1 GB Fails (3 GB < 5.8 GB) F16 5 GB 2 GB Fails (5 GB < 5.8 GB) F32 10 GB 5 GB Succeeds (10 GB > 5.8 GB) F64 25 GB 10 GB Succeeds Interactive SKU Sizer Use this tool to find the minimum SKU for your model's *full refresh*. Your Semantic Model Size: 5.0 GB Required refresh memory: 5.8 GB Minimum SKU for full refresh: F32 Module 1: Immediate Model Optimizations Before implementing long-term fixes, you can often gain stability by optimizing your model. These steps reduce the base memory footprint, making all operations (including refreshes) easier for the system to handle. 1. Add Aggregation Tables If your model queries a large fact table, add aggregation tables (summary tables) over Direct Lake or DirectQuery. This allows Power BI to answer high-level questions (e.g., "sales by month") from a tiny summary table, only hitting the massive fact table for granular details. This reduces query memory. 2. Reduce Model Cardinality Cardinality (the number of unique values in a column) is the primary driver of memory usage. Attack it aggressively: Drop unused columns: If a report does not use a column, remove it from the model. Correct data types: Do not use a "text" type for a number. Ensure integers are used where possible. Disable auto date/time: Power BI's "auto date/time" feature creates hidden tables for *every* date column, bloating the model. Turn this off and use a single, shared date dimension. Trim high-granularity keys: Avoid bringing in high-cardinality keys like transaction IDs or text-based GUIDs unless absolutely necessary for a relationship. 3. Control Refresh Concurrency Do not schedule all your dataset refreshes to run at the same time (e.g., midnight). Stagger the refresh windows. Running multiple large refreshes simultaneously is the fastest way to exhaust capacity memory and cause "Resource Governing" errors. Goal of Optimization: Lower the peak memory usage during refresh and query operations. This keeps your current F32 capacity healthy and creates the necessary headroom to safely test a smaller F16 capacity. The Permanent Fix: Incremental Refresh Relying on large full refreshes is expensive and inefficient. The correct long-term solution is to configure **Incremental Refresh**. This processes only new or changed data, dramatically reducing the memory and time needed for daily operations. Full Refresh Strategy Every night, the system needs 6 GB of memory to reload all 2.9 GB of data. Mon Tue Wed ... Cost: Requires a large, expensive F32 capacity *permanently*. Incremental Refresh Strategy Run one large F32 refresh *once*. Then, daily refreshes are tiny and run on a cheap F8. First Tue Wed ... Cost: Pay for F32 once, then scale down to F8 for daily savings. The "Spike and Scale-Down" Strategy Configure Incremental Refresh in Power BI Desktop. Scale your Fabric capacity *up* to the required SKU (e.g., F32). Publish the model and perform the *first* full data refresh. Once the initial refresh is complete, scale your capacity *down* (e.g., to F8 or F16). Schedule your small, daily incremental refreshes to run on the smaller, cheaper capacity. The Role of Large Semantic Model (LSM) Enabling the Large Semantic Model (LSM) format is necessary for any dataset over 1 GB. This feature changes how data is stored and loaded. Instead of loading the entire model into memory, LSM uses on-demand paging to load only the data needed for a query. While LSM is essential for performance and large models, it does not change the 2x memory rule for a *full refresh*. You must enable LSM *and* use the Incremental Refresh strategy for best results. Module 2: A Structured SKU Testing Plan After implementing optimizations and incremental refresh, you must validate the correct capacity. Do not guess; use a structured test. Your goal is to find the *smallest* SKU that meets your performance and reliability needs. Step 1: Baseline on F32 (Your Current SKU) Before changing anything, use the "Monitoring Toolkit" (see next section) to capture a 24-hour baseline. Run 2-3 production-like refreshes and a controlled query burst. Record the peak CPU, peak memory, and refresh duration. This is your "source of truth." Step 2: Test F16 (Off-Peak) During a low-traffic window, switch the workspace to F16. Re-run the exact same workload (refreshes and query burst). Closely monitor the Metrics App for "Resource Governing" errors or significant throttling. Step 3: Analyze F16 Results Did the refreshes complete within your service-level agreement (SLA)? Were there any failures? Was the report query performance acceptable? If yes, F16 may be a candidate for downsizing. Step 4: Test F64 (Optional Headroom Test) If your F32 baseline showed very high CPU or memory (e.g., >80% peaks), temporarily test an F64. This helps you evaluate if a larger capacity provides significant gains in refresh speed or query concurrency, which might be worth the cost. A Professional's Monitoring Toolkit You cannot fix what you cannot measure. Use the right tool for the job. Basic Intermediate Advanced Fabric Metrics App This is the standard tool provided by Microsoft. It is the best way to monitor your total Capacity Unit (CU) consumption, check for throttling, and see how smoothing is applied to your costs. Use for: Cost analysis, CU peaks, and throttling events. Key Metrics: CPU%, throttles/failures, refresh duration. Azure Monitor Logs The Metrics App is not good for tracking *peak memory*. For that, you must use Azure Monitor Logs. By querying the `AzureDiagnostics` table, you can find the true `ActiveMemory` consumption for your capacity and specific operations. AzureDiagnostics | where Category == 'Engine' | project TimeGenerated, ActiveMemory, CapacityId Use for: Tracking peak memory usage, diagnosing "Resource Governing" causes. Key Metrics: `ActiveMemory`, per-item peak memory. SQL Server Profiler / DAX Studio For the deepest level of analysis, you can connect tools like SQL Server Profiler or DAX Studio to your capacity's XMLA endpoint. This allows you to trace the specific DAX queries, MDX queries, and engine operations that are consuming memory during a refresh. Use for: Pinpointing the *exact* transformation or query causing a memory spike. Key Metrics: Query wait times (p95), expensive measures, refresh concurrency conflicts. Module 3: Making the Data-Driven Decision After your testing, use the monitoring data as the single source of truth. The right SKU is not about a feeling; it is about evidence. Your "final SKU" is the one that meets all of the following criteria: Final SKU Decision Criteria No "Resource Governing" errors during refresh. Refresh completes within the target window (SLA). Report page render times are acceptable (e.g., < 3-5s). Capacity metrics show low or no throttles/failures. Based on this evidence, you can confidently decide to downsize to F16, stay on F32, or justify an upgrade to F64. Related Strategy: Fabric vs. Databricks Solving your Power BI memory problem is often the first step. The next is optimizing your data engineering (DE) workloads. Many teams consider migrating from Azure Databricks to Fabric to create a unified platform. This is a strategic decision with trade-offs. Databricks is a mature platform for heavy Spark jobs. Fabric offers a unified environment, seamless Power BI integration (like Direct Lake), and a single billing model. The best approach is to test and benchmark. Migrate a few representative Databricks notebooks into Fabric Workflows. Compare the runtime, the CU cost in the Metrics App, and the operational simplicity. This data, not just assumptions, should guide your decision. Disclaimer: The Questions and Answers provided on https://gigxp.com are for general information purposes only. We make no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability or availability with respect to the website or the information, products, services, or related graphics contained on the website for any purpose. Share What's your reaction? Excited 0 Happy 0 In Love 0 Not Sure 0 Silly 0 IG Website Twitter
Monitor Memory to Fix Data Refresh in PowerBI & Fabric A practical guide to solving "Resource Governing" errors and correctly sizing your capacity. By the GigXP Tech Team | Updated: October 25, 2025 The "Resource Governing" Error Many Power BI and Fabric users encounter a "Resource Governing" error during a dataset refresh. This operation fails, and the error message is often confusing. You may see something similar to this: "Data source error: Resource Governing: This operation was cancelled because there wasn't enough memory... More details: consumed memory 805 MB, memory limit 134 MB, database size before command execution 2937 MB." The immediate question is: how can the operation consume 805 MB if the limit is only 134 MB? And why does a small F8 capacity fail when an F32 capacity works? The answer is that the "134 MB" limit is not the total capacity. It is the tiny amount of memory *headroom* remaining after your 2.9 GB model was already loaded. The error occurs because the refresh operation cannot fit into that small remaining space. Visualizing the Memory Limit Model in Memory 2.9 GB Limit F8 Capacity (3 GB Max Memory) Refresh Operation (805 MB) Fails to fit in 134 MB Headroom The Root Cause: The 2x Memory Rule A full semantic model refresh requires approximately double the memory of the final model size. This is because the system must keep the *old* model in memory to serve user queries while it simultaneously builds the *new* model. Required Refresh Memory ≈ (Final Model Size) x 2 Example: (2.9 GB Model) x 2 = 5.8 GB Required Memory Choosing the Right Fabric SKU This 5.8 GB requirement explains why the F8 SKU failed. Looking at the official memory limits, F8 (3 GB) and F16 (5 GB) are both too small for this full refresh. The F32 (10 GB) has enough memory, which is why it succeeded. SKU Max Memory (LSM Models) Query Limit Refresh Status (for 5.8 GB) F8 3 GB 1 GB Fails (3 GB < 5.8 GB) F16 5 GB 2 GB Fails (5 GB < 5.8 GB) F32 10 GB 5 GB Succeeds (10 GB > 5.8 GB) F64 25 GB 10 GB Succeeds Interactive SKU Sizer Use this tool to find the minimum SKU for your model's *full refresh*. Your Semantic Model Size: 5.0 GB Required refresh memory: 5.8 GB Minimum SKU for full refresh: F32 Module 1: Immediate Model Optimizations Before implementing long-term fixes, you can often gain stability by optimizing your model. These steps reduce the base memory footprint, making all operations (including refreshes) easier for the system to handle. 1. Add Aggregation Tables If your model queries a large fact table, add aggregation tables (summary tables) over Direct Lake or DirectQuery. This allows Power BI to answer high-level questions (e.g., "sales by month") from a tiny summary table, only hitting the massive fact table for granular details. This reduces query memory. 2. Reduce Model Cardinality Cardinality (the number of unique values in a column) is the primary driver of memory usage. Attack it aggressively: Drop unused columns: If a report does not use a column, remove it from the model. Correct data types: Do not use a "text" type for a number. Ensure integers are used where possible. Disable auto date/time: Power BI's "auto date/time" feature creates hidden tables for *every* date column, bloating the model. Turn this off and use a single, shared date dimension. Trim high-granularity keys: Avoid bringing in high-cardinality keys like transaction IDs or text-based GUIDs unless absolutely necessary for a relationship. 3. Control Refresh Concurrency Do not schedule all your dataset refreshes to run at the same time (e.g., midnight). Stagger the refresh windows. Running multiple large refreshes simultaneously is the fastest way to exhaust capacity memory and cause "Resource Governing" errors. Goal of Optimization: Lower the peak memory usage during refresh and query operations. This keeps your current F32 capacity healthy and creates the necessary headroom to safely test a smaller F16 capacity. The Permanent Fix: Incremental Refresh Relying on large full refreshes is expensive and inefficient. The correct long-term solution is to configure **Incremental Refresh**. This processes only new or changed data, dramatically reducing the memory and time needed for daily operations. Full Refresh Strategy Every night, the system needs 6 GB of memory to reload all 2.9 GB of data. Mon Tue Wed ... Cost: Requires a large, expensive F32 capacity *permanently*. Incremental Refresh Strategy Run one large F32 refresh *once*. Then, daily refreshes are tiny and run on a cheap F8. First Tue Wed ... Cost: Pay for F32 once, then scale down to F8 for daily savings. The "Spike and Scale-Down" Strategy Configure Incremental Refresh in Power BI Desktop. Scale your Fabric capacity *up* to the required SKU (e.g., F32). Publish the model and perform the *first* full data refresh. Once the initial refresh is complete, scale your capacity *down* (e.g., to F8 or F16). Schedule your small, daily incremental refreshes to run on the smaller, cheaper capacity. The Role of Large Semantic Model (LSM) Enabling the Large Semantic Model (LSM) format is necessary for any dataset over 1 GB. This feature changes how data is stored and loaded. Instead of loading the entire model into memory, LSM uses on-demand paging to load only the data needed for a query. While LSM is essential for performance and large models, it does not change the 2x memory rule for a *full refresh*. You must enable LSM *and* use the Incremental Refresh strategy for best results. Module 2: A Structured SKU Testing Plan After implementing optimizations and incremental refresh, you must validate the correct capacity. Do not guess; use a structured test. Your goal is to find the *smallest* SKU that meets your performance and reliability needs. Step 1: Baseline on F32 (Your Current SKU) Before changing anything, use the "Monitoring Toolkit" (see next section) to capture a 24-hour baseline. Run 2-3 production-like refreshes and a controlled query burst. Record the peak CPU, peak memory, and refresh duration. This is your "source of truth." Step 2: Test F16 (Off-Peak) During a low-traffic window, switch the workspace to F16. Re-run the exact same workload (refreshes and query burst). Closely monitor the Metrics App for "Resource Governing" errors or significant throttling. Step 3: Analyze F16 Results Did the refreshes complete within your service-level agreement (SLA)? Were there any failures? Was the report query performance acceptable? If yes, F16 may be a candidate for downsizing. Step 4: Test F64 (Optional Headroom Test) If your F32 baseline showed very high CPU or memory (e.g., >80% peaks), temporarily test an F64. This helps you evaluate if a larger capacity provides significant gains in refresh speed or query concurrency, which might be worth the cost. A Professional's Monitoring Toolkit You cannot fix what you cannot measure. Use the right tool for the job. Basic Intermediate Advanced Fabric Metrics App This is the standard tool provided by Microsoft. It is the best way to monitor your total Capacity Unit (CU) consumption, check for throttling, and see how smoothing is applied to your costs. Use for: Cost analysis, CU peaks, and throttling events. Key Metrics: CPU%, throttles/failures, refresh duration. Azure Monitor Logs The Metrics App is not good for tracking *peak memory*. For that, you must use Azure Monitor Logs. By querying the `AzureDiagnostics` table, you can find the true `ActiveMemory` consumption for your capacity and specific operations. AzureDiagnostics | where Category == 'Engine' | project TimeGenerated, ActiveMemory, CapacityId Use for: Tracking peak memory usage, diagnosing "Resource Governing" causes. Key Metrics: `ActiveMemory`, per-item peak memory. SQL Server Profiler / DAX Studio For the deepest level of analysis, you can connect tools like SQL Server Profiler or DAX Studio to your capacity's XMLA endpoint. This allows you to trace the specific DAX queries, MDX queries, and engine operations that are consuming memory during a refresh. Use for: Pinpointing the *exact* transformation or query causing a memory spike. Key Metrics: Query wait times (p95), expensive measures, refresh concurrency conflicts. Module 3: Making the Data-Driven Decision After your testing, use the monitoring data as the single source of truth. The right SKU is not about a feeling; it is about evidence. Your "final SKU" is the one that meets all of the following criteria: Final SKU Decision Criteria No "Resource Governing" errors during refresh. Refresh completes within the target window (SLA). Report page render times are acceptable (e.g., < 3-5s). Capacity metrics show low or no throttles/failures. Based on this evidence, you can confidently decide to downsize to F16, stay on F32, or justify an upgrade to F64. Related Strategy: Fabric vs. Databricks Solving your Power BI memory problem is often the first step. The next is optimizing your data engineering (DE) workloads. Many teams consider migrating from Azure Databricks to Fabric to create a unified platform. This is a strategic decision with trade-offs. Databricks is a mature platform for heavy Spark jobs. Fabric offers a unified environment, seamless Power BI integration (like Direct Lake), and a single billing model. The best approach is to test and benchmark. Migrate a few representative Databricks notebooks into Fabric Workflows. Compare the runtime, the CU cost in the Metrics App, and the operational simplicity. This data, not just assumptions, should guide your decision.
PowerBI Azure Service Tag & IP Range Extractor for Power BI Firewall Rules Managing firewall rules for Power BI and other Azure services can be challenging, especially with ...
PowerBI Microsoft Fabric F64 vs. Power BI Embedded A4 & EM SKUs Cost Choosing between Microsoft Fabric F64 and Power BI Embedded A4 in 2025 has become a ...
PowerBI Power BI & Fabric Capacity Performance Modeler | Simulate & Optimize Workloads Welcome to the ultimate tool for forecasting your Power BI and Microsoft Fabric capacity needs. ...
PowerBI TCO Calculator: Power BI Embedded vs. Microsoft Fabric Cost Analysis Choosing between Power BI Embedded and Microsoft Fabric for your analytics platform involves more than ...
PowerBI Free Microsoft Fabric Throttling Estimator & Capacity Planner Tool Plan and troubleshoot Microsoft Fabric capacities with this self-contained, bright-mode estimator from GigXP.com. Add your ...
Enterprise Tech EoL for SSRS 2022 – 2025 Migration Roadmap to Power BI reports Is SQL Server Reporting Services (SSRS) retired? The short answer is no, but its final ...
PowerBI Report Server to Server Migration Path Guide – Checklist & Scripts Migrating your Power BI Report Server is a high-stakes project where downtime and risk are ...
PowerBI Guide to Copilot in Power BI Embedded | Features, Limits & ISV Scenarios The promise of AI with Microsoft Copilot is transforming analytics, but for developers using Power ...
PowerBI Is Microsoft Copilot on Fabric Free? Guide to Pricing and Cost-Effective Strategies Many users wonder if Microsoft Copilot on Fabric is available for free through a trial. ...
PowerBI QuickSight to Power BI Migration: The Complete Enterprise Framework (2025) Migrating your enterprise BI platform from Amazon QuickSight to Microsoft Power BI is a significant ...
PowerBI QuickSight on Azure: The Definitive Integration Guide (Synapse & Fabric) Struggling to connect Amazon QuickSight to your data in Azure? You’re not alone. While a ...
PowerBI Guide to Power BI Report Server Licensing (2025) (PBIRS) In today’s hybrid cloud environments, Power BI Report Server (PBIRS) remains a vital cornerstone for ...