A measured baseline, page by page
Before anything changes, the slowest pages are timed visual by visual, so every later fix is judged against a number rather than a feeling. The same pages are re-measured at handover.
Power BI performance
Our Power BI performance optimization consulting finds out why a report is slow before changing anything: senior US-based engineers measure each page, trace the delay to the data model, a DAX measure, the report design, the refresh or the capacity, and fix the causes in order of impact. One written scope, one fixed price agreed before work starts, typical delivery in 2–4 weeks with 30 days of hypercare.
Representative dashboard — sample data
What you get
A report that takes too long to open is rarely slow for one reason. The delay is spread across the model, the measures, the page design and the refresh behind it, and fixing the wrong layer first is how teams spend months tuning without anything feeling faster.
Before anything changes, the slowest pages are timed visual by visual, so every later fix is judged against a number rather than a feeling. The same pages are re-measured at handover.
Wide flat tables reshaped into facts and dimensions, unused columns removed, high-cardinality columns split or dropped, and relationships set to single direction wherever the report does not genuinely need both.
Only the measures the baseline shows are slow: variables instead of repeated expressions, column filters instead of whole-table filters, and iterators kept off large tables where a simpler pattern returns the same result.
Every visual on a page sends its own query. Crowded pages are consolidated, detail moves to drillthrough, and slow custom visuals are swapped for built-in ones that show the same thing.
Power Query steps checked for query folding, history loaded once with incremental refresh where it fits, and filtering pushed back to the source so the refresh moves less data every night.
Each cause found, the evidence for it, what was changed and what was deliberately left alone, plus the before-and-after timings, so the next person to edit the model knows what to protect.
How it works
We agree the pages that matter most, record their timings, capture the queries behind the slowest visuals, and inspect the model’s size and column cardinality. The output is a ranked list of causes, each tied to the layer it lives in.
The largest cause goes first, usually in the model rather than the measures. Changes are made in a copy of your semantic model, and the numbers on every affected visual are reconciled against the original before anything is published.
The same pages are timed again under the same conditions, the findings report is written up, and your report owner gets a walkthrough of what changed and why, with 30 days of hypercare behind it.
Power BI performance work is the job of finding where a report spends its time and removing the causes, rather than buying capacity to outrun them. Power BI gives you the diagnostic tooling to do it properly: Performance Analyzer in Power BI Desktop (opens in new tab) breaks each visual’s load time into the DAX query, the visual rendering and everything else, and Microsoft’s Power BI optimization guide (opens in new tab) sets out where the common costs sit. The work here is applying both to your reports, in the order that matters for your users.
Deliverables are the baseline timings, a ranked diagnosis, the optimized semantic models and reports, reconciliation of every changed number against the original, and a written findings report with before-and-after timings for the pages in scope. Work is performed remotely by senior US-based engineers from our Orange County, CA base, serving every US state, at one fixed price agreed before work starts after your free consultation.
This engagement starts from reports you already have. If the report does not exist yet, or the existing one is beyond saving, our Power BI dashboard development engagement builds it properly from the start: a clean star-schema model, measures written once, and pages designed around the questions people actually ask. We will tell you in the consultation if a rebuild would cost less than tuning what is there.
The other neighbor is control of the wider estate. When the slowness comes from dozens of near-duplicate semantic models all refreshing against the same source, the fix is partly a governance decision about which model is the trusted one, which is what our Power BI governance consulting engagement settles. And if you are comparing outside help for this kind of work, our guide on how to choose a Power BI consultant lists the questions that separate a real diagnosis from a quick rewrite. Once the reports are fast, keeping them that way is ongoing work rather than a project — refresh failures, broken visuals and small changes are what our Power BI support and maintenance services cover, each scoped at a fixed fee.
Most slow reports show one of six patterns. Each has a place it usually lives, a way to confirm it with evidence rather than intuition, and a fix that tends to hold. The table below is the diagnostic map we scope from; your findings report is the filled-in version for your own models.
| What users notice | Where it usually lives | How we confirm it | The fix that tends to hold |
|---|---|---|---|
| One page is slow after every slicer click | A few expensive DAX measures, or too many visuals on the page | Performance Analyzer timings per visual, separating DAX query time from rendering time | Rewrite the slow measures with variables and column filters; consolidate visuals and move detail to drillthrough pages |
| Every report built on one model is slow | The shape of the semantic model | Model size broken down by table and column, relationship directions, and flat tables that should be dimensions | Reshape toward a star schema, remove unused columns, and set relationships to single direction where both are not needed |
| The file is huge and slow to open or publish | High-cardinality columns and hidden date tables | Column cardinality and size, and whether auto date/time has generated a hidden table for each date column | Split date-time columns, drop unique identifiers the report never shows, and replace auto date/time with one shared date table |
| The scheduled refresh runs for hours or fails | Power Query steps, the data source, or the gateway | Refresh history, the step where query folding stops, and how much data each refresh reloads | Restore query folding, filter at the source, and load history once with incremental refresh where the data allows it |
| Fast in Desktop, slow in the service | DirectQuery sources, gateway load, or a shared capacity under contention | Query timings against the source and, on Fabric or Premium capacity, the capacity metrics for the same window | Move tables to import or a composite model where freshness allows; tune the source queries; then size capacity only if still needed |
| Slow only for some users | Row-level security filter expressions | The same pages timed while viewing as each security role | Simplify role filters so they act on small dimension tables, mapped to security groups rather than to complex per-user logic |
The second row is where most engagements find their largest improvement. Microsoft’s star schema guidance for Power BI (opens in new tab) explains why: the engine is built to filter small dimension tables and aggregate one narrow fact table, and a model shaped that way makes most DAX simpler as well as faster.
DAX is where slowness becomes visible, so it is where most tuning effort goes first. But a measure is only as fast as the model it runs against. A well-written measure over a single wide table of every column from the source system will still scan far more than it needs to, and a clever rewrite on that model usually buys a short-lived improvement that disappears as the data grows.
So the diagnosis always looks at model shape and size before measure logic. Where the model is sound, measure rewrites are targeted and quick. Where it is not, reshaping it tends to speed up every report built on it at once, including ones nobody listed as slow. Either way, every changed measure is checked against the original output so that a faster report never means a different number.
A report can open quickly and still be a daily problem if its refresh runs for hours, fails overnight, or leaves the data stale by the time people look. The usual cause is not the source but the steps in between: a transformation that stops query folding, so Power Query pulls every row back and filters locally; or a full reload of years of history that has not changed since last night.
Restoring folding and moving large fact tables onto incremental refresh (opens in new tab), where the source supports it, typically shortens refreshes and makes them far less likely to fail. We confirm the source can support it before recommending it, and we document the partitioning policy so it is not silently undone the next time someone edits the query.
The usual fit is a team whose Power BI reports were built over time by capable people without much time to spare, and have grown slower as the data grew. The trigger is often a specific complaint: a leadership report that takes long enough to open that people ask for a spreadsheet instead, a refresh that fails a few mornings a month, or a capacity bill someone was told would fix it and did not.
It is a poor fit in two cases, and we will say so during the consultation. If the report was never modeled properly and the questions it answers have changed, rebuilding is usually the better purchase. And if the slowness sits in a source database or a network link outside Power BI, we will identify that and hand you the evidence, but tuning that system is a separate piece of work.
The table shows scope and typical timeline rather than prices, because an honest number requires seeing how many reports and semantic models are involved, their data volumes, and how much of the model needs reshaping. For how our fee is set and what is fixed before anything starts, our fixed-fee process spells it out.
| Phase | Scope | Typical timeline | Fee |
|---|---|---|---|
| Phase 1 — baseline and diagnosis | Pages in scope agreed and timed, slow queries captured, model size and cardinality inspected, refresh history and query folding reviewed, and a ranked list of causes produced for your approval | About the first week | Fixed fee — scoped after your free consultation |
| Phase 2 — optimize and reconcile | The approved fixes made in order of impact: model reshaping, measure rewrites, page consolidation, refresh changes. Every affected number reconciled against the original before publishing | Weeks 2–3 | Fixed fee — scoped after your free consultation |
| Phase 3 — re-measure and hand over | The same pages timed again under the same conditions, the written findings report delivered, and a walkthrough for your report owner on what changed and what to keep intact | Week 4 and close-out | Fixed fee — scoped after your free consultation |
Everything produced is yours from the first day: the optimized models, the reports and the findings live in your own Microsoft tenant, never in ours. Nothing is published over your existing reports until you have reviewed the reconciled numbers, and the original versions are kept so any change can be rolled back.
Related services
The build side: a clean semantic model, measures written once, and reports your team actually opens.
Workspaces, certified semantic models, row-level security and sharing rules for an estate that has outgrown its defaults.
Moving an existing Power BI estate onto Fabric, with capacity sized to the workload rather than guessed.
The questions that separate a partner who builds maintainable reporting from one who leaves you with a black box.
Pro, Premium Per User and Fabric capacity, and the license mix that fits a growing team.
When a spreadsheet is still the right tool, and when reporting has outgrown it.
FAQ
It starts with measuring, not guessing. We time each slow page with Performance Analyzer, capture the queries behind it, and trace the delay to its layer: the data model, a DAX measure, the report design, the refresh pipeline or the capacity. Then we fix causes in priority order and re-measure the same pages afterwards.
Less often than people expect. DAX gets blamed because it is visible, but many slow reports trace back to the model underneath: wide flat tables instead of a star schema, high-cardinality columns, bidirectional relationships, or too many visuals querying at once. Rewriting measures on a poorly shaped model rarely delivers a lasting improvement.
Not as a first step. More capacity can help a well-built model under heavy load, but it mostly hides the cost of a poorly built one, and that cost returns as data grows. We fix the model, measures and report design first, then tell you plainly whether your workload genuinely needs a different license or capacity size.
Often, yes. Long or failing refreshes tend to come from Power Query steps that stop query folding, loading full history every night instead of incremental refresh, unused columns imported anyway, or a gateway under strain. We find which step dominates the refresh time and fix that first, before touching anything else.
Only where the design itself is the bottleneck, and nothing changes without your approval. Some pages carry dozens of visuals that each send their own query; consolidating them, moving detail to drillthrough pages or replacing heavy custom visuals can change the layout. The numbers stay the same, and we reconcile them against the original before handover.
Typical delivery is two to four weeks from kickoff, with 30 days of hypercare afterwards. The fixed fee depends on how many reports and semantic models are in scope, their data volumes, and how much of the model needs reshaping. One price is agreed in writing after a free consultation, before any work starts.
Book a free consultation
Tell us what you’re trying to fix — a report, an approval process, an intranet, a Copilot rollout. We scope it as a fixed-fee project, you approve, and a senior engineer delivers in 2–4 weeks.
The fastest way to reach us is the form — tell us the task and we’ll reply within one business day.