How do you optimise a slow Power BI report?
Diagnose first with Performance Analyzer in Power BI Desktop, which shows the time each visual spends on DAX query, visual display, and other. That immediately tells you whether the problem is the model, the DAX, or the report layout. DAX Studio and VertiPaq Analyzer go further, showing which columns consume the most memory.
Model-level fixes — usually the biggest wins:
- Remove columns you do not use. Every column costs memory and refresh time. High-cardinality columns such as GUIDs and timestamps to the second are the most expensive; splitting a datetime into date and time columns often shrinks a model dramatically.
- Adopt a star schema. Flat wide tables and snowflakes both cost performance.
- Reduce cardinality by rounding numbers to the precision you actually report on.
- Filter rows at the source rather than importing history nobody looks at.
DAX-level fixes:
- Avoid iterators over large tables where a simple aggregation would do.
- Use
DIVIDErather than/with anIFguard. - Use variables with
VARto compute something once instead of repeatedly. - Avoid
FILTERover an entire table insideCALCULATEwhen a simple boolean filter argument works.
Report-level fixes: fewer visuals per page — each one issues its own query — limit slicers, and avoid heavy custom visuals.





