Skip to content
Carmel Eve By Carmel Eve Software Engineer II · 1 min read
Optimising DAX: A Series Introduction

Optimising DAX queries in Power BI comes down to two things: how VertiPaq stores and compresses your data, and how the storage and formula engines work together to run a query. This series covers both: the model-design decisions you make before writing any DAX, and the query patterns that keep your reports fast.

Hello! This is the first in a series of posts about optimising DAX queries in Power BI. The content is based on a full-day workshop I attended at SQLBits 2026 by Alberto Ferrari of SQLBI. I learnt a huge amount about how the underlying engines that power Power BI work, and I wanted to write it all up partly to share it, and partly because I find that writing things down is the only way I actually retain them!

The series is split roughly into two halves. The first covers model optimisation - understanding how VertiPaq stores and compresses your data, and how the design decisions you make at the model level affect performance before you ever write a line of DAX. We look at three common model designs and compare how they perform:

  • Star schema - dimension tables (customers, products, dates) linked to a central fact table. Generally the smallest and fastest.
  • Flat table - everything denormalised into a single wide table. Actually compresses reasonably well because of all the repeated values.
  • Header/detail - two fact tables (e.g. an Orders table and an OrderDetails table) linked by a primary key like OrderID. Spoiler: linking two large fact tables via their primary key is about the worst thing you can possibly do.

Diagram showing the three model designs side by side

The second half covers query execution - how the two engines under the hood (the formula engine and the storage engine) divide up the work, what "data materialisation" means, and practical techniques for keeping your queries in the fast lane.

One thing Alberto stressed at the end of the workshop (and I think it's worth saying up front): at a lot of model sizes, these optimisations aren't worth the effort. Unoptimised DAX is often perfectly fine. These techniques become useful when you're working with larger datasets, hitting real performance problems, or operating under capacity constraints. That said, I do think understanding what's going on under the hood makes you write better DAX even when you're not actively optimising - so hopefully this series is useful regardless!

If you're looking to brush up on DAX fundamentals before diving in, we have plenty of content on the blog. My Learning DAX series covers the basics from filter contexts through to CALCULATE, and Elisenda Gascon's Evaluation Contexts in DAX series is another great starting point. Jessica Hill has written in depth about CALCULATE, context transition, and measures vs calculated columns. Her Performance Optimisation Tools for Power BI post is a particularly good companion to this series.

A doodlegram of me sitting next to a Power BI black box

Carmel Eve

Software Engineer II

Carmel Eve

Carmel is a software engineer and LinkedIn Learning instructor. She worked at endjin from 2016 to 2021, focused on delivering cloud-first solutions to a variety of problems. These included highly performant serverless architectures, web applications, reporting and insight pipelines, and data analytics engines. After a three-year career break spent travelling around the world, she rejoined endjin in 2024.

Carmel has written many blog posts covering a huge range of topics, including deconstructing Rx operators, agile estimation and planning and mental well-being and managing remote working.

Carmel has released two courses on LinkedIn Learning - one on the Az-204 exam (developing solutions for Microsoft Azure) and one on Azure Data Lake. She has also spoken at NDC, APISpecs, and SQLBits, covering a range of topics from reactive big-data processing to secure Azure architectures.

She is passionate about diversity and inclusivity in tech. She spent two years as a STEM ambassador in her local community and taking part in a local mentorship scheme. Through this work she hopes to be a part of positive change in the industry.

Carmel won "Apprentice Engineer of the Year" at the Computing Rising Star Awards 2019.