Live Refresh for Real-Time Dashboards: Instantly React to Data Changes in Microsoft Fabric

Live refresh for real-time dashboards in Microsoft Fabric updates DirectQuery and streaming tiles instantly, but multiplies query load and modeling risks.

MP

A Power BI dashboard pinned from a DirectQuery or streaming dataset can now update visuals instantly as new data arrives—no manual refresh or browser reload required. With live refresh for Real-Time Dashboards (now generally available in Microsoft Fabric), you can watch metrics shift as events stream in, but this immediacy comes with model, performance, and design trade-offs you need to understand before rolling it out. By the end of this article, you’ll know where live refresh shines, where it quietly breaks, and how to avoid the most common traps that catch experienced Power BI developers off guard.

Live Refresh: The Mechanism, and Where It Surprises

Unlike scheduled refresh or the classic tile cache, live refresh hooks the dashboard tile directly to a DirectQuery, push, or streaming dataset. As soon as a data change is detected at the source, the dashboard invokes a real-time tile refresh—bypassing the default dashboard cache and reflecting the latest data with near-zero lag for supported sources.

Three non-obvious mechanics matter here:

  1. Visuals update independently of report pages. Report pages pinned to a dashboard do not inherit live refresh. Only tiles pinned directly from eligible datasets support live refresh. Pinning a report visual to a dashboard does not make it “live”—it’s the data source type, not the visual, that enables this.
  2. Live refresh relies on the dataset’s real-time capabilities, not just DirectQuery mode. Only DirectQuery, push, and streaming datasets are eligible. Import mode is excluded, even if the source updates frequently. For hybrid models, only tiles sourced from the DirectQuery partition will update live; tiles sourced from imported tables will not.
  3. Real-time visuals may not update uniformly. The backend triggers tile refresh when new data lands, but visuals with slow queries or complex DAX can lag behind the fastest events—especially if the underlying source throttles or blocks concurrent queries.

The official release blog (see here) confirms these mechanics and their current limits.

Performance: Live Refresh Turns Every Event Into a DAX Query

The most common mistake is assuming a real-time dashboard remains “lightweight” because the visuals look simple. In reality, each live refresh event triggers a full query for every tile—effectively multiplying your DirectQuery load by the data arrival rate and the number of dashboard viewers.

Dashboard Viewers Multiply Query Load

Take a DirectQuery dataset tracking IoT device events, with data arriving every second. If you have 10 dashboard tiles and 20 simultaneous viewers, each new event can trigger up to 200 DAX queries per second against your data source. This load scales linearly and ignores any background refresh or cache layer—a capacity planning risk that is easy to underestimate.

Complex DAX Is Now a Real-Time Bottleneck

DAX measures that were “fast enough” for interactive reports can bottleneck live dashboards, especially if they force the formula engine to perform row-by-row calculations or context transitions on every event. Context transition via CALCULATE inside iterators, or heavy use of SUMX over large tables, can push query times past the arrival rate of new data, creating a visible lag or even dropped refreshes.

// Naive measure: total recent events in the last 5 minutes
Total Recent Events :=
CALCULATE(
    COUNTROWS('Fact_Events'),
    FILTER(
        'Fact_Events',
        'Fact_Events'[Timestamp] >= NOW() - TIME(0,5,0)
    )
)

This measure works, but on high-frequency data, it evaluates over every row in Fact_Events for every event, forcing the formula engine into a bottleneck. The result: dashboard tiles lag behind the data, or queries time out under load.

Folding and Source Pushdown Are Now Mandatory

With live refresh, the old “just in time” optimization tricks (like pre-aggregating in Power Query, or caching in VertiPaq) are off the table. Anything that breaks query folding—such as Table.Buffer in Power Query, or non-foldable custom columns—forces the entire live refresh query to pull unoptimized data from the source, compounding latency.

Check folding for each step in Power Query using “View Native Query”; if folding is broken, live dashboard performance will degrade rapidly as event rates rise.

Worked Example: A Real-Time IoT Dashboard That Doesn’t Refresh as Expected

Imagine a Fabric workspace with a DirectQuery dataset exposing Fact_Events (device_id, event_time, value) and a marked Date table. You pin two visuals to a dashboard:

  • A card showing [Current Active Devices] — devices with at least one event in the past 60 seconds.
  • A line chart showing [Events Per Minute] over the past hour.

You expect both tiles to update instantly as new events arrive. In practice, only the card updates live; the line chart lags or fails to update at all. Why?

  1. Naive DAX breaks folding. If [Events Per Minute] uses a calculated column or a DAX pattern that can’t be pushed down (like iterating over generated time buckets), the DirectQuery source receives a much heavier query, or none at all for “current” time buckets.
  2. Dashboard tile type matters. If the line chart was pinned from a report page (not directly from the dataset), it does not inherit live refresh—even if the underlying dataset is real-time.
  3. Concurrent refreshes queue up. If a spike in events arrives (say, 100 devices reporting at once), the dashboard may throttle or drop refreshes to avoid query storms, leaving tiles stale until the next eligible update.

The fix requires both modeling and dashboard design:

  • Rewrite [Events Per Minute] as a measure that pushes aggregation to the source:
Events Per Minute :=
CALCULATE(
    COUNTROWS('Fact_Events'),
    FILTER(
        'Fact_Events',
        'Fact_Events'[event_time] >= NOW() - TIME(1,0,0)
    )
)

But for true pushdown, model the aggregation in the source view or use a foldable Power Query step:

// In Power Query (M), create a grouped aggregation that folds:
let
    Source = Sql.Database("server", "db"),
    Events = Source{[Schema="dbo", Item="Fact_Events"]}[Data],
    RecentEvents = Table.SelectRows(Events, each [event_time] >= DateTime.LocalNow() - #duration(0,1,0,0)),
    Grouped = Table.Group(
        RecentEvents,
        {"device_id", "minute_bucket"},
        {{"EventCount", each Table.RowCount(_), Int64.Type}}
    )
in
    Grouped

Pin the resulting visual directly from the dataset, not from a report page. Confirm folding with “View Native Query”—if it’s disabled, rethink the transformation.

Limits and Real-World Failure Modes

Live refresh is not a free upgrade to every dashboard—there are constraints and silent failure modes:

  • Import mode is excluded. No matter how often you refresh, tiles from imported datasets will not update live.
  • Data arrival rates can outpace query completion. If events arrive faster than the backend can re-query and render tiles, some updates will be skipped or lag behind real time.
  • Dashboard tiles refresh independently; slicers and cross-filters do not update in sync. Each tile is a snapshot, not a live, cross-filtered report canvas. This breaks the mental model many users have from interactive reports.
  • Licensing and capacity matter. As of this writing, live refresh is available in Microsoft Fabric workspaces; DirectQuery and streaming models consume capacity per query and per viewer. There is no per-tile throttle—if you have many viewers, you can exhaust capacity quickly.

How to Design for Live Refresh Without Sabotaging Performance

  • Use DirectQuery or streaming datasets exclusively for live-refresh tiles; avoid Import mode for anything that needs instant updates.
  • Minimize complex DAX and avoid row-by-row iterators or context transition inside live tiles—prefer source-side aggregation and folding.
  • Always confirm Power Query folding at the last applied step; use “View Native Query” to guarantee pushdown.
  • Pin visuals directly from the dataset, not from a report page, to enable true live refresh.
  • Monitor query volume and dashboard concurrency—model for the worst-case load, not for a single viewer.

Live refresh is a leap forward for event-driven dashboards, but it demands the same rigor in data modeling, DAX design, and capacity planning as any DirectQuery workload—multiplied by the pace of your data. Before you promise “real time” to users, audit every tile for folding, aggregation, and concurrency risk. If you need cross-filtered, interactive views, stick with report pages and accept the refresh latency; if you need up-to-the-second updates, design for it from the ground up.

MP
Max Power
Published June 14, 2026  ·  Updated June 14, 2026