<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CostFabric</title>
    <description>The latest articles on DEV Community by CostFabric (@costfabric).</description>
    <link>https://dev.to/costfabric</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4210907%2F6936bff7-3530-4e6b-8b38-280c40481c99.png</url>
      <title>DEV Community: CostFabric</title>
      <link>https://dev.to/costfabric</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/costfabric"/>
    <language>en</language>
    <item>
      <title>Dataflow Gen2 Eating Your Microsoft Fabric Capacity? Why Default Settings Burn 60-80% Extra CUs</title>
      <dc:creator>CostFabric</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:44:38 +0000</pubDate>
      <link>https://dev.to/costfabric/dataflow-gen2-eating-your-microsoft-fabric-capacity-why-default-settings-burn-60-80-extra-cus-3geo</link>
      <guid>https://dev.to/costfabric/dataflow-gen2-eating-your-microsoft-fabric-capacity-why-default-settings-burn-60-80-extra-cus-3geo</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://costfabric.com/blog/dataflow-gen2-cu-consumption-optimization/" rel="noopener noreferrer"&gt;costfabric.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you open the Microsoft Fabric Capacity Metrics app on almost any tenant that recently migrated from Power BI Service or Azure Data Factory, one item kind usually dominates the background CU table: &lt;strong&gt;Dataflow Gen2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is common to see a single Dataflow Gen2 refresh that moves a few hundred thousand rows from SQL Server or an ERP into a Fabric Lakehouse consume more Capacity Units (CUs) than all of the company's interactive Power BI reports combined. Because background operations in Fabric are smoothed across 24 hours, a handful of frequent Dataflow Gen2 runs will quietly build a 40% to 70% baseline CU floor that never goes away, eventually pushing daytime users into &lt;code&gt;CapacityLimitExceeded&lt;/code&gt; throttling.&lt;/p&gt;

&lt;p&gt;Why does Dataflow Gen2 consume so many CUs for relatively small datasets, and how do you quantify how much of your capacity budget it is actually burning?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why default Dataflow Gen2 runs are so expensive
&lt;/h2&gt;

&lt;p&gt;When an engineer creates a new Dataflow Gen2 in the Fabric UI and selects a Lakehouse or Warehouse destination, Fabric enables a series of heavy compute steps by default that most teams do not realize are running:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default Lakehouse Staging (&lt;code&gt;Enable staging&lt;/code&gt;):&lt;/strong&gt; By default, every query in a Dataflow Gen2 stages its output into an internal staging Lakehouse and SQL analytics endpoint before writing to your final destination. That means a simple transformation ends up reading from the source, spinning up Mashup compute, writing to OneLake staging storage, invoking the staging SQL engine, and then copying the data a second time into your target table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-folding Power Query transformations:&lt;/strong&gt; If a Power Query step breaks query folding (for example, merging across two connectors, applying custom M functions, or filtering after a type conversion that the source driver cannot translate), the Mashup container pulls the entire raw dataset into memory and processes it row-by-row at high CU rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-frequency full refreshes:&lt;/strong&gt; Because Dataflow Gen1 on Power BI Premium used to feel "free" until CPU maxed out, many teams carried over 30-minute or hourly full-table refreshes into Dataflow Gen2. In Fabric, every one of those runs adds CU-seconds to your 24-hour background smoothing ledger.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The compounding effect on your F-SKU bill
&lt;/h2&gt;

&lt;p&gt;Because Dataflow Gen2 is classified as a background operation, Fabric spreads its CU consumption over the next 24 hours.&lt;/p&gt;

&lt;p&gt;That sounds helpful when you only run one job a day. But when you run a set of Dataflow Gen2 refreshes every hour between 7:00 AM and 7:00 PM, their 24-hour smoothing tails stack on top of each other. By mid-afternoon, your capacity is still paying off the smoothed CU debt from the 7:00 AM, 8:00 AM, 9:00 AM, and 10:00 AM runs simultaneously.&lt;/p&gt;

&lt;p&gt;When teams see their &lt;code&gt;F16&lt;/code&gt; or &lt;code&gt;F32&lt;/code&gt; sitting at 85% baseline utilization all afternoon, they often assume their business has outgrown the capacity and upgrade to an &lt;code&gt;F64&lt;/code&gt;. In reality, they are paying an extra $2,500 to $4,000 per month just to run redundant staging writes in Power Query Online.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Measure how much of your smoothing floor comes from background bloat
&lt;/h2&gt;

&lt;p&gt;Before you start rewriting pipelines or upgrading your SKU, check your last 14 days of Capacity Metrics to see what your background smoothing floor is actually costing you in dollars per year:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export your capacity utilization timeline from the Fabric Capacity Metrics app.&lt;/li&gt;
&lt;li&gt;Compare your &lt;strong&gt;Average 24h background CU %&lt;/strong&gt; against your &lt;strong&gt;Average interactive CU %&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check how many hours per day your capacity would sit below 15% CU if that artificial background floor were removed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can run this check offline in a couple of minutes with our zero-macro Excel symptom checker or the open-source Python CSV summary script at &lt;a href="https://costfabric.com/tools/" rel="noopener noreferrer"&gt;https://costfabric.com/tools/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you know how many dollars per year are going into background smoothing overhead, the next step is auditing which specific Dataflow Gen2 queries should have staging disabled, which loads belong in Data Factory Copy Activity or Spark notebooks, and how far you can safely step down your F-SKU afterward. If you want a concrete, artifact-level plan for your tenant, request a free 48-hour capacity readout at &lt;a href="https://costfabric.com/check/" rel="noopener noreferrer"&gt;https://costfabric.com/check/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>dataengineering</category>
      <category>powerbi</category>
      <category>etl</category>
    </item>
    <item>
      <title>Power BI Premium P1 to Microsoft Fabric F64 Migration: Why Most Teams Are Over-Provisioned</title>
      <dc:creator>CostFabric</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:38:46 +0000</pubDate>
      <link>https://dev.to/costfabric/power-bi-premium-p1-to-microsoft-fabric-f64-migration-why-most-teams-are-over-provisioned-cjj</link>
      <guid>https://dev.to/costfabric/power-bi-premium-p1-to-microsoft-fabric-f64-migration-why-most-teams-are-over-provisioned-cjj</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://costfabric.com/blog/p1-to-f64-migration-cost-sizing/" rel="noopener noreferrer"&gt;costfabric.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With Power BI Premium per-capacity (&lt;code&gt;P1&lt;/code&gt;, &lt;code&gt;P2&lt;/code&gt;, &lt;code&gt;P3&lt;/code&gt;) retired in favor of Microsoft Fabric F-SKUs, every licensing table and migration slide deck shows the same one-to-one mapping: &lt;code&gt;P1&lt;/code&gt; (8 v-cores) equals &lt;code&gt;F64&lt;/code&gt; (64 Capacity Units).&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;F64&lt;/code&gt; is also the threshold where free Power BI viewer access kicks in (so report viewers do not each need a paid Power BI Pro license), procurement and BI teams almost always default to migrating their old &lt;code&gt;P1&lt;/code&gt; straight into a 1-year reserved &lt;code&gt;F64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When you inspect the Fabric Capacity Metrics app a month after the migration, however, a huge percentage of those &lt;code&gt;F64&lt;/code&gt; tenants look the same: average CU utilization across the week sits between 14% and 28%, overnight utilization drops below 10%, and the only time the graph crosses 60% is during a poorly staggered 7:00 AM refresh wave.&lt;/p&gt;

&lt;p&gt;Here is why the &lt;code&gt;P1&lt;/code&gt; to &lt;code&gt;F64&lt;/code&gt; rule of thumb causes so much overspending, and how to check what your workload actually uses before you renew.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an F64 behaves differently than an old P1
&lt;/h2&gt;

&lt;p&gt;On legacy Power BI Premium &lt;code&gt;P1&lt;/code&gt;, teams routinely sized for peak morning concurrency because CPU spikes from unoptimized DAX or overlapping dataset refreshes could degrade interactive report rendering right away.&lt;/p&gt;

&lt;p&gt;Microsoft Fabric capacities (&lt;code&gt;F2&lt;/code&gt; through &lt;code&gt;F128&lt;/code&gt;+) enforce compute governance differently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;24-hour background smoothing:&lt;/strong&gt; Scheduled semantic model refreshes, Dataflow Gen2 runs, and Spark jobs are smoothed across a full 24-hour window rather than creating a sharp instantaneous wall that blocks report viewers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5-minute interactive smoothing:&lt;/strong&gt; Interactive DAX queries are smoothed across at least 5 minutes, absorbing brief executive dashboard bursts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible workspace-to-capacity assignment:&lt;/strong&gt; Unlike a monolithic &lt;code&gt;P1&lt;/code&gt; where every workspace had to live on the same capacity, Azure lets you provision smaller Pay-As-You-Go or reserved F-SKUs (&lt;code&gt;F8&lt;/code&gt;, &lt;code&gt;F16&lt;/code&gt;, &lt;code&gt;F32&lt;/code&gt;) and separate production BI from bursty development or ETL workloads.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Pro-license math trap
&lt;/h2&gt;

&lt;p&gt;The most common defense for keeping an under-utilized &lt;code&gt;F64&lt;/code&gt; (~$5,008/month on a 1-year reservation, or ~$8,410/month Pay-As-You-Go) is that dropping below &lt;code&gt;F64&lt;/code&gt; requires Power BI Pro licenses for report viewers.&lt;/p&gt;

&lt;p&gt;Do the arithmetic on your actual viewer headcount before accepting that assumption:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dropping from a reserved &lt;code&gt;F64&lt;/code&gt; (~$5,008/month) to a reserved &lt;code&gt;F32&lt;/code&gt; (~$2,504/month) saves roughly &lt;strong&gt;$2,504 per month ($30,048 per year)&lt;/strong&gt; in capacity spend.&lt;/li&gt;
&lt;li&gt;Even at ~$10 to $14 per user per month for Power BI Pro, $2,504 per month covers roughly &lt;strong&gt;180 to 250 paid viewer seats&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;More importantly, in many Microsoft 365 Enterprise tenants, a large share of corporate users already hold Microsoft 365 E5 licenses, which include Power BI Pro at zero incremental cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your organization either has fewer than 200 Pro-less viewers or already runs on E5, paying an extra $30,000 to $50,000 per year for an &lt;code&gt;F64&lt;/code&gt; that sits 75% empty is pure waste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where you actually have to be careful when right-sizing
&lt;/h2&gt;

&lt;p&gt;Dropping from &lt;code&gt;F64&lt;/code&gt; to &lt;code&gt;F32&lt;/code&gt; or &lt;code&gt;F16&lt;/code&gt; is not just a matter of clicking "Scale" in the Azure portal on a Friday afternoon. While CU throughput scales linearly, per-artifact guardrails also step down with the SKU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max semantic model memory:&lt;/strong&gt; An &lt;code&gt;F64&lt;/code&gt; supports up to 25 GB per model in memory, whereas an &lt;code&gt;F32&lt;/code&gt; caps individual models at 10 GB and &lt;code&gt;F16&lt;/code&gt; caps them at 5 GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Lake framing and fallback guardrails:&lt;/strong&gt; Max rows per table and max memory before a Direct Lake model falls back to DirectQuery decrease on smaller F-SKUs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smoothed background floor:&lt;/strong&gt; If a single workspace has 30 unoptimized Dataflow Gen2 refreshes running with default staging enabled, that background floor will consume twice the percentage of an &lt;code&gt;F32&lt;/code&gt; as it did on an &lt;code&gt;F64&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check your 14-day utilization profile first
&lt;/h2&gt;

&lt;p&gt;Before you sign a 12-month reservation on an &lt;code&gt;F64&lt;/code&gt; (or before you scale down blindly and hit an out-of-memory error on Monday morning), measure three symptoms from your last 14 days of Capacity Metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What percentage of your 30-second windows sit below 15% CU?&lt;/li&gt;
&lt;li&gt;What is your steady-state 24-hour background smoothing floor?&lt;/li&gt;
&lt;li&gt;How many windows actually cross 50% or 100% CU, and which specific operations cause them?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can run that symptom check offline in 5 minutes using the zero-macro Excel workbook at &lt;a href="https://costfabric.com/tools/" rel="noopener noreferrer"&gt;https://costfabric.com/tools/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the checker shows that more than half of your &lt;code&gt;F64&lt;/code&gt; spend is going to idle headroom, and you want to verify which target F-SKU and workspace layout your semantic models can safely step down to without hitting memory or throttling limits, request a free 48-hour capacity readout at &lt;a href="https://costfabric.com/check/" rel="noopener noreferrer"&gt;https://costfabric.com/check/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>finops</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Why Pausing Your Microsoft Fabric Capacity Triggers Surprise Azure Bills (Smoothing &amp; Carryforward)</title>
      <dc:creator>CostFabric</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:37:42 +0000</pubDate>
      <link>https://dev.to/costfabric/why-pausing-your-microsoft-fabric-capacity-triggers-surprise-azure-bills-smoothing-carryforward-3i31</link>
      <guid>https://dev.to/costfabric/why-pausing-your-microsoft-fabric-capacity-triggers-surprise-azure-bills-smoothing-carryforward-3i31</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://costfabric.com/blog/pause-smoothing-carryforward-billing/" rel="noopener noreferrer"&gt;costfabric.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A lot of data teams move to Microsoft Fabric on a Pay-As-You-Go F-SKU (&lt;code&gt;F16&lt;/code&gt;, &lt;code&gt;F32&lt;/code&gt;, or &lt;code&gt;F64&lt;/code&gt;) with a simple cost-saving plan: run the capacity during business hours, pause it at 7:00 PM via an Azure Automation runbook or Logic App, and cut the monthly bill in half.&lt;/p&gt;

&lt;p&gt;Then the first month's Azure invoice arrives, and the savings are nowhere near 50%. Even worse, you see unexpected billing spikes right at the exact minute the capacity was paused.&lt;/p&gt;

&lt;p&gt;If you have seen this happen, you are running into how Microsoft Fabric handles 24-hour background smoothing and carryforward settlement on pause.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Fabric smoothing actually works under the hood
&lt;/h2&gt;

&lt;p&gt;In Microsoft Fabric, your capacity does not bill you per query. It gives you a fixed pool of Capacity Units (CUs) every second:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;code&gt;F16&lt;/code&gt; gives you 16 CU-seconds per second (57,600 CU-seconds per hour).&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;F32&lt;/code&gt; gives you 32 CU-seconds per second (115,200 CU-seconds per hour).&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;F64&lt;/code&gt; gives you 64 CU-seconds per second (230,400 CU-seconds per hour).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To keep short spikes from immediately throttling your users, Fabric smooths compute usage over time. Interactive operations (like opening a Power BI report or running a DAX query) are smoothed across a minimum of 5 minutes. Background operations (like scheduled semantic model refreshes, Dataflow Gen2 runs, Spark notebooks, and Data Factory pipelines) are smoothed across a full 24-hour window.&lt;/p&gt;

&lt;p&gt;When a heavy nightly refresh or Dataflow Gen2 batch consumes more CUs than your SKU provides in that window, Fabric borrows capacity from future windows over the next 24 hours. That borrowed usage is called &lt;strong&gt;carryforward&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you pause a capacity with active carryforward
&lt;/h2&gt;

&lt;p&gt;As long as your capacity stays running 24/7, that 24-hour smoothing window works in your favor. A massive 6:00 AM refresh spreads its CU footprint gently across the rest of the day and night while the capacity sits mostly idle.&lt;/p&gt;

&lt;p&gt;When you pause a Pay-As-You-Go capacity in Azure, however, the 24-hour clock stops immediately. Microsoft does not forgive whatever smoothed CU debt was still sitting in your future carryforward queue. Instead, when the capacity transitions to &lt;code&gt;Paused&lt;/code&gt;, Azure settles all remaining accumulated carryforward and smoothed CU usage onto your bill at once.&lt;/p&gt;

&lt;p&gt;Consider a concrete example on an &lt;code&gt;F32&lt;/code&gt; capacity (32 CUs):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;At 4:30 PM, a set of heavy Dataflow Gen2 jobs and semantic model refreshes kick off.&lt;/li&gt;
&lt;li&gt;Together they consume 460,800 CU-seconds of work. On an &lt;code&gt;F32&lt;/code&gt;, that equals 4 full hours of 100% capacity compute, which Fabric normally spreads out at roughly 16.7% CU across the next 24 hours.&lt;/li&gt;
&lt;li&gt;At 6:30 PM, your automation script pauses the &lt;code&gt;F32&lt;/code&gt; capacity to save money overnight.&lt;/li&gt;
&lt;li&gt;Only 2 hours of that 24-hour smoothing window have elapsed. The remaining unabsorbed CU debt is immediately flushed and billed as an overage charge when the capacity pauses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even worse, if teams pack all of their refreshes right before the evening pause window or right after the morning resume window, they end up paying for the daytime active hours plus the settled carryforward from the background jobs. At that point, a paused Pay-As-You-Go capacity can easily cost more than a 1-year Azure Reservation running 24/7 (since a 1-year reservation already discounts the hourly rate by roughly 40.5%, putting the break-even point around 99.2 hours per week).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check if your capacity is carrying hidden smoothing debt
&lt;/h2&gt;

&lt;p&gt;Before you build pause/resume automation or change your F-SKU size, look at a 14-day export from the Microsoft Fabric Capacity Metrics app and check three numbers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your baseline background CU % floor at 3:00 AM.&lt;/strong&gt; If nobody is querying reports at 3:00 AM and no jobs are running, yet your capacity sits at 25% to 45% CU utilization, that entire floor is 24-hour smoothed background work from earlier in the day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The timing of your heaviest background jobs relative to your planned pause hour.&lt;/strong&gt; Any heavy background job that finishes within 6 to 12 hours before a pause will leave a large chunk of smoothed CUs unsettled when the shutdown hits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total weekly active hours plus carryforward drain time.&lt;/strong&gt; Once you add the hours required to let background debt drain cleanly before pausing, many teams discover their true billable window is 110+ hours per week.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We put together a lightweight, zero-macro Excel workbook and a 60-line Python CSV script that calculate your idle CU hours, your 24-hour background smoothing floor, and your unutilized spend percentage from a standard Capacity Metrics export. You can grab the free offline checker at &lt;a href="https://costfabric.com/tools/" rel="noopener noreferrer"&gt;https://costfabric.com/tools/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Diagnosing the bleed is step one. Actually fixing it without breaking morning report SLAs requires isolating the specific artifacts driving the smoothing floor, deciding whether to split bursty ETL onto a separate capacity or switch billing models, and scheduling your workload windows so carryforward hits zero before shutdown. If you want an engineer-reviewed breakdown of your own tenant's metrics, you can request a free 48-hour capacity readout at &lt;a href="https://costfabric.com/check/" rel="noopener noreferrer"&gt;https://costfabric.com/check/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>powerbi</category>
      <category>dataengineering</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
