A slow Power BI report is an observed symptom, not a DAX diagnosis. The delay can occur while preparing visual queries, evaluating DAX, translating or executing DirectQuery, waiting on a gateway or source, queuing behind other visuals, rendering a visual, retrieving images, enforcing security, or competing for capacity. Rewriting a measure without identifying the dominant layer can change business results while leaving the user experience unchanged.
Datrick treats performance tuning as controlled engineering. We capture a reproducible interaction, preserve the result and filter context, locate the bottleneck, make one bounded change, and replay the same workload. AI can assemble evidence, explain model and DAX dependencies, rank suspicious patterns, and draft alternatives. It cannot replace a production measure, relationship, storage mode, or business definition without deterministic result comparison, review, deployment control, and rollback.
Does one executive report take seconds per interaction, behave differently in the Service, or consume disproportionate capacity? Datrick can assess the report and semantic model, identify the measured bottleneck, and provide an implementation-ready remediation plan.
Define a reproducible performance contract
Do not baseline by opening a report once. Define the report, page, user or role, filter state, slicer action, drill path, browser or Desktop version, Service workspace, semantic-model version, storage mode, cache condition, time of day, capacity, data volume, expected result, and acceptable response time. Include cold and warm behavior where both matter. Repeat enough times to separate normal variation from a material change.
| Layer | Evidence | Question answered |
|---|---|---|
| User interaction | Report, page, visual, action, filters, role, browser, location, timestamp, total latency, expected result, and user impact. | Which exact experience is slow and how much improvement is required? |
| Performance Analyzer | Visual duration, DAX query, DirectQuery, visual display, other time, evaluated parameters, order, and exported JSON. | Is the delay query execution, rendering, queueing, or another report operation? |
| DAX execution | Generated query, measures, filter context, formula and storage-engine work, scans, callbacks, materialization, rows, and cache state. | Which expression or execution pattern consumes time and why? |
| Semantic model | Tables, columns, cardinality, data types, relationships, direction, measures, calculated objects, hierarchies, security, and size. | Does model structure force expensive queries, large scans, or ambiguous filters? |
| Source and transformation | Power Query steps, folding, generated source query, plan, rows, bytes, indexes, statistics, latency, concurrency, and source load. | Is work performed efficiently at the right layer, especially for DirectQuery? |
| Environment | Storage mode, gateway, network, region, capacity timepoint, concurrency, throttling, cache, deployment version, and recent changes. | Why does the same report differ by environment, user, or time? |
| Correctness and outcome | Control totals, selected cells, filter cases, row-level security, edge cases, performance delta, CU delta, and owner approval. | Did the change preserve meaning and improve the intended service outcome? |
Microsoft Performance Analyzer records the time each visual takes and separates DAX query, DirectQuery, visual display, and other work. The exported JSON and copied DAX query make a useful starting point. Durations can include queueing because report operations share UI resources, so interpret the order and interaction rather than treating every number as isolated compute time.
Locate the slow layer before choosing a fix
Report and visual design
Every visual can issue queries, participate in interactions, and consume rendering time. Test whether the page requests too many visuals at once, contains expensive custom visuals, renders high-cardinality tables, loads remote images or maps, or triggers unnecessary cross-filtering. Use query reduction and interaction design where appropriate, but preserve the questions users need to answer. Removing information is not an optimization if users recreate it through exports and manual work.
DAX measures and filter context
Measure performance depends on the exact query and model context. Inspect expensive iterators, repeated expressions, context transitions, broad filters, virtual relationships, nested calculations, high-cardinality intermediate results, and operations pushed into the formula engine. Avoid generic rules such as “never use this function.” A function can be efficient in one filter context and expensive in another.
For each proposed rewrite, compare totals and detail across representative dimensions, no-selection and multi-selection states, missing values, period boundaries, inactive relationships, many-to-many paths, row-level security roles, and calculation groups. A faster wrong measure is a regression.
Semantic-model structure
A well-designed star schema reduces ambiguity and supports efficient filtering. Review fact and dimension grain, relationship cardinality and direction, snowflaking, role-playing dimensions, bridge tables, hidden technical columns, unused columns, data types, calculated columns, and column cardinality. Large text or identifier columns can increase model size even when they never appear in a report.
Model reduction can improve memory, refresh, and query behavior, but verify lineage and external consumers before removing objects. Excel connections, thin reports, paginated reports, APIs, and other semantic models may depend on fields not visible in the target report.
Import, DirectQuery, Direct Lake, and composite behavior
Storage mode determines where work executes and which constraints dominate. Import models depend heavily on model design, compression, and DAX execution. DirectQuery depends on generated queries, source design, network and gateway latency, concurrency, and round trips. Composite and hybrid models can cross storage engines and create unexpected paths. Direct Lake adds its own fallback and model considerations.
For DirectQuery, capture the generated source query and actual source plan where authorized. Check query folding, predicates, joins, indexes, statistics, partitions, result size, source concurrency, and gateway path. Reducing a DAX duration in Desktop is not enough if the Service still waits on an overloaded source.
Power Query and source preparation
Transformation choices affect refresh and sometimes interactive performance. Review folding boundaries, data-type conversions, row and column reduction, merge and group operations, parameterization, source views, and repeated queries. Push appropriate set-based work to capable sources, but do not duplicate business logic across unmanaged layers. Record where each transformation is owned and tested.
Service, gateway, network, and capacity
A report that is fast in Desktop and slow in the Service needs an environment comparison. Check deployed versions, user security context, gateway mapping, source route, region, browser rendering, cache, concurrent users, semantic model operations, and capacity timepoints. Use the Fabric Capacity Metrics app to determine whether the report was affected by shared overload or throttling. Do not rewrite DAX to compensate for a capacity incident.
Run an evidence-led optimization workflow
| Stage | Work performed | Control |
|---|---|---|
| Scope and preserve | Select representative interactions, capture source and deployed artifacts, record business controls, owners, security roles, and current performance. | Versioned baseline, approved data access, reproducible steps, and no production edits. |
| Instrument | Collect Performance Analyzer, DAX query, model, source, gateway, Service, capacity, browser, and user-impact evidence. | Clock alignment, cache state, sensitive-data handling, and evidence completeness. |
| Diagnose | Separate visual, DAX, model, source, DirectQuery, gateway, network, concurrency, and capacity contributors. | Ranked hypotheses, alternatives, citations, and tests that can disprove each cause. |
| Design change | Propose bounded report, measure, model, storage, query, source, gateway, or capacity remediation. | Expected latency and CU effect, correctness risk, dependencies, effort, rollback, and owner. |
| Validate | Replay matched interactions, compare results and security, measure cold and warm latency, and observe shared-environment impact. | Deterministic controls, statistical variation, no shifted bottleneck, and acceptance threshold. |
| Release and observe | Deploy through the approved path, monitor user experience, errors, refresh, source, gateway, and capacity after release. | Change window, rollback trigger, stakeholder approval, and post-release evidence. |
Use AI as an analyst, not an autonomous model editor
AI can summarize Performance Analyzer traces, map visual queries to measures, explain filter context, compare measure versions, group repeated patterns, identify likely high-cardinality drivers, draft source and model questions, and generate a test matrix. It is especially useful when evidence spans report, model, source, gateway, and capacity owners.
Keep production write access out of the analysis agent. Require exact artifact versions, evidence links, confidence, alternatives, and missing information. Never send business data, DAX, schema, queries, or user information to an unapproved model endpoint. Log prompts and outputs according to the engagement's data-handling policy.
Validate performance and business semantics together
Compare the same report page, interaction, filter state, role, data version, environment, and cache condition. Run multiple samples and report distributions, not the best run. Measure total user latency and the layer-specific change. If a query becomes faster but visual rendering or queueing dominates, the user may receive little benefit.
Build result controls before modifying DAX or relationships. Compare approved totals, detail samples, dimension slices, period boundaries, blanks, unknown members, subtotal behavior, and security roles. For source or Power Query changes, reconcile row counts, keys, duplicates, aggregates, and late data. For storage-mode changes, test freshness, concurrency, source impact, and failure behavior.
Observe after deployment during representative load. A Desktop improvement can disappear under Service concurrency. Confirm report latency, semantic-model query behavior, capacity CU, source load, gateway health, refresh duration, errors, and user feedback. Preserve before-and-after evidence and identify any demand shifted to another system.
Prioritize changes by user value and engineering risk
- User experience: page load, slicer response, drill, tooltip, export, mobile use, abandonment, and decision deadline.
- Query: DAX and DirectQuery duration, formula and storage-engine work, round trips, rows returned, cache behavior, and variability.
- Model: size, cardinality, unused data, relationship complexity, scan volume, storage mode, and shared-consumer impact.
- Environment: gateway and source latency, concurrency, capacity CU, throttling, network path, region, and deployed-version drift.
- Control: incorrect total, broken filter, RLS exposure, unsupported external consumer, refresh regression, source overload, and unapproved change.
Sequence high-confidence, high-user-impact changes with bounded risk first. Some issues need architecture work rather than a quick formula rewrite. Label temporary containment, permanent remediation, prerequisite data work, and capacity decisions separately so stakeholders understand what each change accomplishes.
Assess one critical report in one to three weeks
- Select a report with measurable slowness, meaningful use, an accessible semantic model, and named business and technical owners.
- Define representative interactions, security roles, data versions, cache conditions, business results, performance targets, and deployment environments.
- Collect report, model, DAX, Power Query, source, gateway, Service, capacity, usage, change, and incident evidence.
- Baseline total and layer-specific latency with Performance Analyzer and approved complementary diagnostics.
- Rank visual, DAX, model, source, storage-mode, gateway, network, concurrency, and capacity contributors.
- Design bounded remediations with expected impact, correctness controls, dependency analysis, effort, rollback, and owner.
- Implement selected changes in a controlled copy and replay the matched result and performance test matrix.
- Deliver prioritized findings, implementation changes where scoped, before-and-after evidence, release plan, monitoring, and maintenance guidance.
A one-report assessment can often finish in one to three weeks. Implementation can take two to six weeks when source changes, model redesign, storage-mode changes, shared semantic-model dependencies, or formal release controls are required. The engagement should end with measured findings and an approval-ready change plan, not a generic best-practice checklist.
Frequently asked questions
How do you diagnose why a Power BI report is slow?
Replay representative user interactions and capture Performance Analyzer evidence for each visual. Separate DAX query, DirectQuery, visual display, and other time, then correlate slow operations with model structure, measures, source queries, gateway, network, capacity, concurrency, and report design. Optimize the measured bottleneck and verify the same interaction against an unchanged business result.
What is included in a Power BI performance optimization assessment?
A focused assessment can include user scenarios, Performance Analyzer captures, DAX query and measure analysis, model size and cardinality, relationships, storage mode, Power Query and folding, source execution, DirectQuery round trips, visual design, gateway and network evidence, service and capacity behavior, prioritized remediation, and before-and-after validation.
Can AI optimize DAX measures automatically?
AI can explain a measure, identify suspicious patterns, relate query and model evidence, draft alternatives, and generate test cases. It should not replace a production measure automatically. DAX semantics depend on filter context, relationships, totals, row-level security, calculation groups, and business definitions. Every change requires deterministic result comparison, performance measurement, review, and controlled deployment.
Why is a Power BI report fast in Desktop but slow in the Service?
Desktop and Service can differ in data-source path, gateway, network, capacity load, concurrency, cache state, region, browser rendering, security context, storage mode, credentials, and deployed model version. Capture the same interaction in both environments and join report evidence with gateway, source, semantic model, and capacity evidence before changing DAX.
How long does a Power BI performance tuning engagement take?
One critical report and semantic model can often be assessed in one to three weeks when the PBIX or project source, representative data, Performance Analyzer captures, business result controls, source access, Service evidence, and owners are available. Implementation and observation can take two to six weeks depending on model redesign, source work, deployment controls, and user acceptance.
Official implementation references
- Microsoft Power BI Performance Analyzer
- Microsoft Power BI optimization guidance
- Microsoft Power BI star schema guidance
- Microsoft Power BI DirectQuery model guidance
- Microsoft Power BI report-level auditing guidance
- Microsoft Power BI DAX query view
Start with one slow report and the interaction users cannot tolerate. Datrick can isolate the report, query, model, source, gateway, or capacity bottleneck and validate a bounded remediation against business results.
