[{"data":1,"prerenderedAt":328},["ShallowReactive",2],{"index":3,"/articles/fabric-couts":38,"/articles/fabric-couts-surround":302},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"informations":9,"_id":32,"_type":33,"_source":34,"_file":35,"_stem":36,"_extension":37},"/","",false,"Pierre Graef - Data Engineer","Pierre Graef — Data Engineer specializing in ETL pipelines, cloud integration, and scalable data architectures. Proficient in Python, SQL, Spark, and Airflow.",{"name":10,"job":11,"availability":12,"email":13,"link":14,"profile":18,"skills":20,"description":21,"experience":22},"Pierre Graef","Data Engineer",true,"graef.pierre@gmail.com",{"x":5,"linkedin":15,"instagram":5,"github":16,"kaggle":17},"https://www.linkedin.com/in/pierre-graef","https://github.com/PierreGR7","https://www.kaggle.com/pierregraef",{"url":19},"/img/profil.png","Python | SQL | Spark | Airflow","I am a Data Engineer specializing in data architecture, ETL pipelines, and cloud integration. Proficient in Python, SQL, Spark, Airflow, I design scalable data systems, optimize workflows, and build insightful dashboards with Power BI. With international experience, I transform complex datasets into actionable business solutions.",[23,27],{"company":24,"role":11,"period":25,"location":26},"CeA","2024 – Present","Strasbourg, France",{"company":28,"role":29,"period":30,"location":31},"Munich Re","Intern Data Analyst",2024,"Munich, Germany","content:index.yml","yaml","content","index.yml","index","yml",{"_path":39,"_dir":40,"_draft":6,"_partial":6,"_locale":5,"title":41,"description":42,"authors":43,"image":46,"date":48,"lang":49,"translationPath":50,"body":51,"_type":297,"_id":298,"_source":34,"_file":299,"_stem":300,"_extension":301},"/articles/fabric-couts","articles","Microsoft Fabric — Keeping Capacity Costs Under Control","Notes from the field on monitoring and cutting the Microsoft Fabric bill — the Metrics app, smoothing, throttling, and the levers that actually move the number.",[44],{"name":10,"to":15,"avatar":45},{"src":19},{"src":47},"/img/article_fabric/cover.svg","2026-06-16T01:00:00.000Z","en","/articles/fabric-couts-fr",{"type":52,"children":53,"toc":289},"root",[54,62,83,90,102,128,140,152,158,170,189,194,200,226,238,244,249,254,259,271,277],{"type":55,"tag":56,"props":57,"children":58},"element","p",{},[59],{"type":60,"value":61},"text","At work, Fabric costs became a topic roughly the month we moved a real production workload onto it. Nobody looks at first — it runs, the reports refresh, everyone's happy. Then someone opens the Azure bill and asks why it doubled. That's when it becomes my problem.",{"type":55,"tag":56,"props":63,"children":64},{},[65,67,73,75,81],{"type":60,"value":66},"The thing with Fabric is that you don't pay per query. You pay for a ",{"type":55,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":60,"value":72},"capacity",{"type":60,"value":74}," — a shared pool of compute that everything draws from: Spark notebooks, pipelines, the warehouse, semantic models, Power BI rendering. Convenient, but it means the bill never tells you ",{"type":55,"tag":76,"props":77,"children":78},"em",{},[79],{"type":60,"value":80},"who",{"type":60,"value":82}," spent what. And when a pipeline goes sideways or a model refreshes every fifteen minutes, it's eating the exact same capacity as the dashboards management opens every morning. Nobody notices right away. That's the trap.",{"type":55,"tag":84,"props":85,"children":87},"h2",{"id":86},"understand-what-youre-paying-for-first",[88],{"type":60,"value":89},"Understand what you're paying for first",{"type":55,"tag":56,"props":91,"children":92},{},[93,95,100],{"type":60,"value":94},"You're billed in ",{"type":55,"tag":68,"props":96,"children":97},{},[98],{"type":60,"value":99},"Capacity Units (CU)",{"type":60,"value":101},". You pick a SKU — F2, F4, F8, and up through sizes you'll probably never buy — and the number is roughly the CU per second you get. Everything goes through it.",{"type":55,"tag":56,"props":103,"children":104},{},[105,107,112,114,119,121,126],{"type":60,"value":106},"Two things genuinely changed how I think about the cost. First, a ",{"type":55,"tag":68,"props":108,"children":109},{},[110],{"type":60,"value":111},"pay-as-you-go",{"type":60,"value":113}," capacity can be ",{"type":55,"tag":68,"props":115,"children":116},{},[117],{"type":60,"value":118},"paused",{"type":60,"value":120},", and a paused capacity bills no compute at all. Second, a one-year ",{"type":55,"tag":68,"props":122,"children":123},{},[124],{"type":60,"value":125},"reservation",{"type":60,"value":127}," runs about 40% cheaper but keeps the meter running whether you use it or not. The whole trade-off lives between those two, and I'll come back to it.",{"type":55,"tag":56,"props":129,"children":130},{},[131,133,138],{"type":60,"value":132},"There's also a licensing gotcha that took me a while to internalise: at ",{"type":55,"tag":68,"props":134,"children":135},{},[136],{"type":60,"value":137},"F64 and above",{"type":60,"value":139},", Power BI content viewing is included for consumers. Below that, everyone who opens a report needs a Pro license. If you have a lot of viewers, do the math before reaching for the smallest SKU \"to save money\" — sometimes a bigger SKU is actually cheaper once you net out the Pro licenses. Counter-intuitive, but it's happened to us.",{"type":55,"tag":56,"props":141,"children":142},{},[143,145,150],{"type":60,"value":144},"And OneLake ",{"type":55,"tag":68,"props":146,"children":147},{},[148],{"type":60,"value":149},"storage",{"type":60,"value":151}," is billed separately, per GB per month. Usually a small line, but mirroring and stray files do add up over time.",{"type":55,"tag":84,"props":153,"children":155},{"id":154},"the-one-habit-to-build-the-metrics-app",[156],{"type":60,"value":157},"The one habit to build: the Metrics app",{"type":55,"tag":56,"props":159,"children":160},{},[161,163,168],{"type":60,"value":162},"You can't cut what you can't see, and early on I was cutting blind. The day I installed the ",{"type":55,"tag":68,"props":164,"children":165},{},[166],{"type":60,"value":167},"Microsoft Fabric Capacity Metrics app",{"type":60,"value":169},", half the problem became obvious in ten minutes. Point it at the capacity and you get CU usage over time, throttling events, overloads — and, most useful, a ranking of the items consuming the most. That ranking is where I found our culprit: a scheduled refresh on a model nobody opened anymore, running every fifteen minutes for months.",{"type":55,"tag":56,"props":171,"children":172},{},[173,175,180,182,187],{"type":60,"value":174},"On top of that I set a ",{"type":55,"tag":68,"props":176,"children":177},{},[178],{"type":60,"value":179},"budget with alerts",{"type":60,"value":181}," in Azure Cost Management and tag capacities by environment, so spend is attributable and the alert lands ",{"type":55,"tag":76,"props":183,"children":184},{},[185],{"type":60,"value":186},"before",{"type":60,"value":188}," the budget meeting, not during it.",{"type":55,"tag":56,"props":190,"children":191},{},[192],{"type":60,"value":193},"If you take one thing away: install the app and look at what's consuming. The answer is almost always surprising.",{"type":55,"tag":84,"props":195,"children":197},{"id":196},"smoothing-and-throttling-or-why-the-bill-looks-weird",[198],{"type":60,"value":199},"Smoothing and throttling, or why the bill looks weird",{"type":55,"tag":56,"props":201,"children":202},{},[203,205,210,212,217,219,224],{"type":60,"value":204},"Fabric doesn't bill spikes naively. It ",{"type":55,"tag":68,"props":206,"children":207},{},[208],{"type":60,"value":209},"smooths",{"type":60,"value":211}," them. Interactive operations (queries, clicking around a report) are smoothed over a few minutes; background operations (pipelines, refreshes, notebooks) are smoothed over ",{"type":55,"tag":68,"props":213,"children":214},{},[215],{"type":60,"value":216},"24 hours",{"type":60,"value":218},". On top of that, ",{"type":55,"tag":76,"props":220,"children":221},{},[222],{"type":60,"value":223},"bursting",{"type":60,"value":225}," lets a heavy job temporarily exceed your capacity to finish faster, then pays it back through smoothing.",{"type":55,"tag":56,"props":227,"children":228},{},[229,231,236],{"type":60,"value":230},"This is fine until you overcommit. When projected future usage climbs too high, Fabric ",{"type":55,"tag":68,"props":232,"children":233},{},[234],{"type":60,"value":235},"throttles",{"type":60,"value":237}," in stages: it delays interactive requests, then rejects them, and finally rejects background jobs. The first time this hit me, my instinct was to ask for a bigger SKU. Wrong answer. The real problem was that we'd stacked every heavy job at 2 a.m., and all that background debt smoothed into the day and choked the interactive side. We spread the schedules across the night and the throttling vanished — without spending a cent more.",{"type":55,"tag":84,"props":239,"children":241},{"id":240},"what-actually-brings-the-number-down",[242],{"type":60,"value":243},"What actually brings the number down",{"type":55,"tag":56,"props":245,"children":246},{},[247],{"type":60,"value":248},"Roughly in the order it pays off, from what I've seen:",{"type":55,"tag":56,"props":250,"children":251},{},[252],{"type":60,"value":253},"Pausing non-production capacities is by far the biggest win and the dumbest one to miss. A dev or test capacity left on overnight and through the weekend is money out the window. On pay-as-you-go, automate pause and resume around working hours and you cut the non-prod bill by more than half without breaking anything.",{"type":55,"tag":56,"props":255,"children":256},{},[257],{"type":60,"value":258},"Next, reserve what genuinely runs around the clock. If a prod capacity never stops, the ~40% reservation discount is free money, so take it. But I keep anything bursty or part-time on pay-as-you-go — the right to pause is usually worth more than the discount.",{"type":55,"tag":56,"props":260,"children":261},{},[262,264,269],{"type":60,"value":263},"The rest is hygiene. Size to real measured peak with headroom, not to a number someone guessed at kickoff, and re-check it every quarter because workloads drift. Spread refreshes out and question every schedule (does that model ",{"type":55,"tag":76,"props":265,"children":266},{},[267],{"type":60,"value":268},"really",{"type":60,"value":270}," need a 15-minute refresh?). And above all, tune Spark, because that's where most CU leaks away: right-sized pools, no small-files problem (fewer, larger Parquet files), V-Order on for Direct Lake tables, Native Execution Engine where it applies. A well-tuned job costs a fraction of a sloppy one. Where the model allows it, I prefer Direct Lake over import + frequent refresh — you stop paying to reload data that already lives in OneLake. And I set a surge-protection guardrail so one bad job can't starve everyone else.",{"type":55,"tag":84,"props":272,"children":274},{"id":273},"where-to-start",[275],{"type":60,"value":276},"Where to start",{"type":55,"tag":56,"props":278,"children":279},{},[280,282,287],{"type":60,"value":281},"Definitely not with micro-optimisation. The big, fast wins are structural: pause what's idle, reserve what's steady, spread what's heavy. The rest comes later. Install the Metrics app first so every decision is driven by what the capacity is ",{"type":55,"tag":76,"props":283,"children":284},{},[285],{"type":60,"value":286},"actually",{"type":60,"value":288}," doing rather than a hunch — and re-check after each change. In a shared pool, the effect of a fix shows up exactly where you can measure it, and watching that curve come back down is honestly pretty satisfying.",{"title":5,"searchDepth":290,"depth":290,"links":291},2,[292,293,294,295,296],{"id":86,"depth":290,"text":89},{"id":154,"depth":290,"text":157},{"id":196,"depth":290,"text":199},{"id":240,"depth":290,"text":243},{"id":273,"depth":290,"text":276},"markdown","content:articles:fabric-couts.md","articles/fabric-couts.md","articles/fabric-couts","md",[303,314],{"_path":50,"_dir":40,"_draft":6,"_partial":6,"_locale":5,"title":304,"description":305,"authors":306,"image":309,"date":48,"lang":310,"translationPath":39,"_type":297,"_id":311,"_source":34,"_file":312,"_stem":313,"_extension":301},"Microsoft Fabric — Garder ses coûts de capacité sous contrôle","Retour d'expérience sur le monitoring et la réduction de la facture Microsoft Fabric — l'app Metrics, le lissage, le throttling, et les leviers qui font vraiment bouger la note.",[307],{"name":10,"to":15,"avatar":308},{"src":19},{"src":47},"fr","content:articles:fabric-couts-fr.md","articles/fabric-couts-fr.md","articles/fabric-couts-fr",{"_path":315,"_dir":40,"_draft":6,"_partial":6,"_locale":5,"title":316,"description":317,"authors":318,"image":321,"date":323,"lang":310,"translationPath":324,"_type":297,"_id":325,"_source":34,"_file":326,"_stem":327,"_extension":301},"/articles/opus-4-8-fr","Opus 4.8 — Savoir ce qu'il ne sait pas","Un court avis sur ce qui change vraiment avec Opus 4.8 — moins de conclusions forcées, plus d'honnêteté sur ses propres limites.",[319],{"name":10,"to":15,"avatar":320},{"src":19},{"src":322},"/img/article_opus/cover.svg","2026-06-01T01:00:00.000Z","/articles/opus-4-8","content:articles:opus-4-8-fr.md","articles/opus-4-8-fr.md","articles/opus-4-8-fr",1781630438977]