In partnership with Roar Data (Australia) · Fixed-price, always· +61 433 345 000

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.

Serving Dubai and the UAE. Remote delivery, 7am–7pm Gulf Standard Time, seven days. Delivered in partnership with Roar Data, an Australian Power BI consultancy.

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.

FindingPoints to
Unused columns, auto date/time on, folding broken, too many visualsPatch
Star schema present; measures mostly in one place; refresh works most daysPatch
Many-to-many joins because grain was never decidedRebuild
Same KPI in several reports with different resultsRebuild
Business logic in calculated columns and report-level measuresRebuild
Security roles nobody can explain; source changed under the queriesRebuild

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.

Power BI Performance Optimisation — questions people ask

Why are our Power BI dashboards slow?
Usually for one of eight reasons: columns loaded that nothing uses, no date table, many-to-many relationships, calculated columns carrying business logic, Power Query steps that stop the source doing the work, too many visuals on a page, auto date/time left on, or row-level security written against the fact table. The health check measures each and ranks them by their effect on the symptom you reported, so the fix is chosen from evidence rather than guessed.
Can you take over reports someone else built?
Yes. The health check does not need the original author. It reads the model, the queries, the refresh history and the gateway as they are, and produces a findings list anyone can act on. If the model is worth patching, the fixes are quoted from the list; if it needs a rebuild, the list becomes the specification.
Should we rebuild or patch?
Patch when the model has a sound star schema, measures mostly in one place and refresh that works most days, and the findings are localised things like unused columns, broken folding and crowded pages. Rebuild when the tables are joined many-to-many, the same KPI gives different answers in different reports, business logic lives in calculated columns, or nobody can explain the security roles. In the second case each fix is cheap but there are dozens and they interact, and the rebuild is cheaper within a quarter.
Is it our licence?
Sometimes. It is a capacity problem when a well-built model is larger than its licence allows, when many users hit it at once and the capacity metrics show throttling, or when a retiring Premium P-SKU needs a Fabric capacity sized for it. It is not a capacity problem when a page is slow for one user at a quiet hour; that is the model or the page, and buying capacity would only make it expensive. The health check tells you which.
How long does a health check take?
It depends on the size of the model and how quickly we get read access to the workspace, the gateway and, where query folding is in question, the source. The duration is written into the fixed-price scope for the check. Access on day one is the thing that most affects it.
What do we receive?
A written findings list ranked by impact on your symptoms, with a fix estimate against each finding; a patch-or-rebuild recommendation with the reasons; a refresh reliability assessment covering gateway, incremental refresh, timeouts and alerting; and a licence and capacity position. Every fix is then quoted from that list as a fixed price, and you choose which to do.

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

Models and reports in the health check.
Access: read access to the workspace, the gateway and, where folding is at issue, the source.
Which findings from the list are in the fix scope, in what order.
Whether the fixes are deployed by us or handed to your owner to deploy.

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.