Power BI performance optimisation — and when to rebuild instead
Pages that take longer than a few seconds, refreshes that fail or run for hours, numbers that differ between reports: a fixed-price health check that measures the causes and ranks the fixes, then fixes quoted from the findings.
The symptoms
Slow Power BI shows up in three ways, and they usually arrive together. A page takes ten, twenty or forty seconds to render, so managers stop opening it. The overnight refresh fails twice a week, or runs for three hours and finishes after the people who needed it have started their day. And two reports that should agree do not, because each carries its own copy of the logic.
None of these is mysterious. Each has a small set of causes that can be measured, and each measurement points at a fix. This page lists what we measure, what we commonly find, how we decide whether to patch or rebuild, and what the health check delivers. It is the entry point; the fixes are quoted from what it finds.
A fixed-price health check
The health check is a fixed price, agreed before we open anything, and it covers one semantic model and the reports on it. For an estate with several models, each is scoped as its own check or the models are prioritised on the first call. We measure eight things.
- Model size and cardinality: the compressed size of the model, the size of each table and column, and the columns with high cardinality (timestamps, free text, transaction IDs) that dominate memory.
- Relationships and bi-directional filters: every relationship, its cardinality and direction, and every many-to-many or bi-directional filter, because these are where slow pages and wrong totals both begin.
- DAX patterns: measures using iterators over large tables, context transition inside iterators, FILTER over whole tables where a column filter would do, and calculated columns that should be measures or should be done in the query.
- Power Query folding: whether each query pushes its work to the source or pulls the whole table and works on it in memory, which is the difference between a ten-minute refresh and a three-hour one against a Tally ODBC or SQL export.
- Refresh timings: the history of every scheduled refresh, its duration and its failures, with the failures classified by cause.
- Gateway configuration: version, placement, the account it runs under, driver versions, and whether it is on a machine that also runs the ERP.
- Visual count and query count per page: how many visuals a page renders, how many queries they generate, and which ones take the time.
- Capacity and licence fit: whether the workload is on Pro, Premium Per User or a Fabric capacity, what the capacity metrics show, and whether the model is within the limits of the licence it is on.
- The output is a written findings list, ranked by impact on the symptoms you reported, with a fix estimate for each finding, so you can choose which to do, in what order, and see what each one costs before committing.
Common causes we find
Eight causes account for most slow reports. Each is listed with the fix, because the fix is usually smaller than the symptom suggests.
- Imported columns nobody uses. Every column in the source was loaded, including the ones no visual or measure touches, and the model is three times the size it needs to be. Fix: remove them in Power Query; the model shrinks and every page speeds up.
- No date table. Time intelligence is written against a date column in the fact table, so every year-to-date measure does more work than it should and comparable-period logic is inconsistent. Fix: a proper date table marked as such, with the fiscal year and the Ramadan and Eid periods as attributes, and the measures rewritten against it.
- Many-to-many relationships. Two tables joined on a non-unique column, usually because a bridge table was skipped, making every filter ambiguous and every total suspect. Fix: a proper dimension or bridge table and single-direction relationships.
- Calculated columns instead of measures. Row-by-row calculations stored in the model, recalculated on every refresh and taking memory on every row. Fix: convert to measures where the value is an aggregate, or move to Power Query where it is a row attribute.
- Unfolded queries against Tally or SQL exports. A filter or a merge step placed after a step the source cannot fold, so the entire table is pulled across the gateway before the filter is applied. Fix: reorder the steps or push the logic into a view, so the source does the work.
- Too many visuals on a page. Forty visuals generate forty or more queries every time a slicer changes. Fix: one question per page, fewer visuals, and drill-through for the detail instead of showing it all at once.
- Auto date/time left on. Power BI builds a hidden date hierarchy for every date column in the model, quietly multiplying its size. Fix: turn it off and use the date table.
- Row-level security applied inefficiently. Security rules written as lookups over the fact table, evaluated for every query, so a multi-entity model is slow for exactly the users it was secured for. Fix: rules on the dimension tables, with the entity key propagated through single-direction relationships.
Patch or rebuild?
The findings list makes this decision for you more often than not, because it shows whether the problems are a few fixable things or whether the structure itself is wrong. The rule we apply is this: patch when the model’s shape is sound and the findings are localised; rebuild when fixing the findings would mean redoing the model anyway.
A model is worth patching when it has a recognisable star schema, when the measures are mostly in one place, when refresh works most of the time, and when the findings list is dominated by unused columns, folding, visual count and auto date/time — the fixes that change the model’s size and speed without changing its structure.
A model should be rebuilt when the tables are joined many-to-many because the grain was never decided, when the same measure exists in several reports with different results, when calculated columns carry the business logic, when nobody can explain a security role, or when the source has changed so much that the queries are a patch on a patch. In those cases each individual fix is cheap, but there are dozens of them and they interact, and the rebuild is the cheaper path within a quarter. When an Existing Power BI Setup Should Be Rebuilt, Not Patched sets the commercial test out in full.
When the answer is rebuild, the findings list becomes the specification: the health check is not wasted, and the rebuild is quoted as a fixed price against it under the Power BI developer Dubai or consulting service, depending on scope.
| Finding | Points to |
|---|---|
| Unused columns, auto date/time on, folding broken, too many visuals | Patch |
| Star schema present; measures mostly in one place; refresh works most days | Patch |
| Many-to-many joins because grain was never decided | Rebuild |
| Same KPI in several reports with different results | Rebuild |
| Business logic in calculated columns and report-level measures | Rebuild |
| Security roles nobody can explain; source changed under the queries | Rebuild |
Refresh reliability
A report that is fast but refreshes unreliably is still a report nobody trusts, so refresh is treated as its own set of findings. Four things decide it.
- Gateway placement: the gateway should sit close to the source, on a machine that is on when the refresh runs, under a service account that does not expire. A gateway on the finance manager’s laptop, or on the same machine as Tally where the ODBC driver needs Tally open, is the most common cause of a failed refresh in a UAE finance estate.
- Incremental refresh: loading only the recent partition each night instead of the entire history, so a five-year fact table refreshes in minutes. This needs a proper date column and folding queries, which is why it is a fix that follows the others.
- Source timeouts: a query that runs for longer than the source or the gateway allows, usually because it is unfolded. The fix is folding first and, where the source is simply slow, a staging step that lands the data before the model reads it.
- Alerting: a refresh failure that nobody sees until Sunday’s meeting is a process failure, not a technical one. Failure alerts go to a named owner, and under a managed service they come to us at the same time.
Licence and capacity fit
Slowness is sometimes a capacity problem and more often is not, and the health check says which. It is a capacity problem when the model is well built but larger than the licence allows, when many users hit the same model at the same hour and the capacity metrics show throttling, or when a Premium per-capacity P-SKU is being retired and the workload needs a Fabric capacity sized for it. In those cases the finding is a licence recommendation — Pro to Premium Per User, or PPU to an F-SKU — with the list-price cost and the reason.
It is not a capacity problem when a page is slow for one user at 2pm on a Tuesday. That is the model or the page, and buying capacity would make an inefficient model expensive rather than fast. We say which one it is, because the two fixes cost very different amounts. The licensing options and their UAE pricing context are on the Power BI Dubai hub.
The other services
Six services, one pricing method. Most engagements use one or two of them together.
Power BI Consulting Services Dubai
Power BI consulting services in Dubai
Open the service pagePower BI Dashboard Development Dubai
Power BI dashboard development in Dubai
Open the service pageCorporate Power BI Training Dubai
Corporate Power BI training in Dubai, run on your own data
Open the service pagePower BI Managed Services UAE
Power BI managed services for the UAE
Open the service pageExcel Reporting Automation Dubai
Excel reporting automation in Dubai
Open the service pagePower BI Performance Optimisation — questions people ask
Why are our Power BI dashboards slow?
Can you take over reports someone else built?
Should we rebuild or patch?
Is it our licence?
How long does a health check take?
What do we receive?
Pricing
The method is published alongside the numbers, because what drives a figure matters as much as the figure. The diagnostic is a fixed price; a build is quoted against a written scope.
The health check is a fixed price of AED 4,950 for one semantic model and its reports, agreed before we open anything. That is the whole amount. Nothing is added at checkout. The fixes are then quoted from the findings list: each finding carries its own estimate, you choose which to do, and the chosen set becomes a fixed-price scope.
Where the findings point to a rebuild rather than a set of fixes, the rebuild is quoted against them as its specification and starts at AED 15,500. That is an anchor rather than a price: what a rebuild costs depends on what the health check found, which is why it is quoted after the measurement rather than before it.
A short discovery call, no charge
Thirty minutes on GST hours, and a look at your current reports and the systems behind them. We tell you the smallest practical next step, even if it is smaller than you expected.
A written scope
Sources, the model, pages and visuals, users and their security, training and handover, written down. If it is not in the scope, it is not in the quote.
A fixed quote against that scope
One number in writing. The quote is the price; there is no hourly rate underneath it to drift.
Inside scope is our cost; outside scope is quoted first
If we find something worse than expected inside the scope, that is our cost. If you want something outside it, we quote it separately before doing it, and you decide.
Payment stages
Agreed in the scope document, in writing, before work starts.
What it costs
The reporting diagnostic is a fixed AED 4,950. That is the whole amount. Nothing is added at checkout. Builds are quoted rather than sold from a page: they start at AED 15,500, and most land in the AED 15,500 to AED 62,000 range once the sources, the state of the data, the pages and the training are known. The figure in your written quote is the price.
What the scope itemises for this service
Once the estate is fast and refreshing, the Power BI managed services UAE service keeps it that way. If you would rather read before you call, why Power BI reports are slow and what to check first walks through the first three measurements above. When you are ready, Get started — four quick questions books a thirty-minute call at no charge.
Ready to find out what this would take for your business?
Four quick questions tell us the systems you run, the reports you assemble by hand and who reads them. From there, a 30-minute call, no charge, and a written scope if it makes sense to go further.


