Slow Power BI dashboards are rarely a Power BI problem. They are almost always a data model problem that Power BI is honestly surfacing. The platform is fast when the model is right and punishingly slow when it isn’t, which is useful information if you treat it as such — and a source of constant frustration if you treat the symptom (the slow dashboard) as the problem.
Most of the optimisation work we do on inherited Power BI estates is undoing decisions taken three years earlier when the model was first built. Calculated columns where measures would have done. Snowflake schemas imported verbatim from the source database. Visuals dependent on row-by-row context transitions across hundreds of thousands of records. Each decision was reasonable in isolation; together they compound into a model that no amount of DAX tuning will rescue.
The principles that distinguish a Power BI model that scales
The optimisation surface has ten meaningful levers; in our work, three of them do most of the work on most projects. The remaining seven matter, but the three below are where we focus the diagnostic energy first.
Model design beats query optimisation every time.
Profile, don't guess.
Constraints are features.
Underneath the three sits a discipline the commandments don’t make explicit: cadence-fit modelling. A model built for hourly refresh against a fact table of 50 million rows is a different model from one built for daily refresh against 5 million. Incremental refresh, aggregation tables, and the Import-vs-DirectQuery decision all hinge on the cadence question — and getting it wrong at modelling time produces dashboards that perform well in dev and stall in production. We size the cadence before we size the model.
The ten commandments
Use measures, not calculated columns
Deliverable Smaller model, faster refresh.
Embrace the star schema
Deliverable Predictable query plans.
Use incremental refresh
Deliverable Hourly cadence on tables that would otherwise require a nightly run.
Enforce query folding
Deliverable Transformations run in the source database, not in memory.
Create aggregation tables
Deliverable High-level dashboards resolve from pre-aggregated data.
Implement RLS via roles
Deliverable Access control that doesn't distort the query plan.
Limit visuals per page
Deliverable Fewer queries fired on every page render.
Default to Import mode
Deliverable In-memory speed instead of per-query round-trips.
Use variables in complex DAX
Deliverable Readable, debuggable, faster measures.
Profile performance with DAX Studio
Deliverable Optimisation hours land where they pay back.
The ten commandments optimise an existing Power BI implementation. They do not ask the prior question: is Power BI the right tool for this use case? For ad-hoc analytical exploration, Tableau and Sigma have stronger interactivity surfaces. For embedded analytics inside operational applications, Looker is often a better fit. For ML pipelines or compute-heavy feature engineering, Power BI is the wrong layer entirely — that work belongs in the warehouse or a notebook. The Data Foundations pillar we run with clients includes the BI-tooling fit assessment.
