← Back to Patterns

Why your BI dashboards melt BigQuery

Dashboards do not passively read data. They generate repeated, variable workload, and that behavior is often the real source of BigQuery cost and latency pain.

By Ivan Richter LinkedIn

Last updated: Sep 1, 2026

4 min read

On this page

A dashboard is a query generator with a user interface attached.

One page load may issue a query per tile. Filters create new variants. Auto-refresh repeats them. Several users open the same report at once. A visually quiet dashboard can therefore produce high concurrency, inconsistent cache hits, and a steady scan bill.

Treat that workload as a product surface. Measure what it generates before blaming BigQuery for doing exactly what the client requested.

Inspect fan-out, not only the slowest query

Start with one representative interaction and trace every resulting job.

Count queries per page load, bytes processed, queue time, execution time, cache hits, destination tables, and generated SQL variants. Then repeat with common filters and concurrent users. The expensive behavior often appears in aggregate rather than in one spectacular statement.

Ten acceptable queries issued by twenty users every few minutes can matter more than one ugly query somebody runs once. Optimization work that only sorts job history by bytes misses that mechanism.

Cache misses usually expose SQL variation

BigQuery’s result cache is useful when eligible query text and underlying data line up. BI tools routinely generate enough variation to miss it: different literals, selected columns, wrappers, chart-specific calculations, or small predicate changes.

Don’t build the serving strategy around forcing cache hits. First remove accidental variation. Give charts shared governed fields and stable serving models. Consolidate tiles that ask the same business question at slightly different grains. Disable refresh cadences that outrun source freshness.

After that, cache is welcome upside rather than an invisible dependency.

Move business logic out of charts

Chart-level calculated fields, blends, and custom SQL make semantics harder to review and queries harder to reuse. Each dashboard becomes its own transformation layer, so the warehouse pays to reconstruct the same metric in several slightly different forms.

Push shared joins, classifications, currencies, time boundaries, and KPI definitions into upstream models. Let the dashboard filter and present governed outputs. It may still calculate display-only ratios or labels, but it shouldn’t decide what revenue, active customer, or late order means.

This improves trust before it improves performance. The lower query churn is a useful consequence.

Build a serving table at the interaction grain

A dashboard reading raw events or transformation intermediates usually has the wrong interface. Create a table or view shaped around the repeated interaction: daily sales by branch, current account status by owner, order risk by warehouse, or whichever grain the user explores.

Select only the dimensions needed for filtering and the measures needed for display. Preserve drill-through through a separate detail path rather than forcing every summary tile to carry raw-level complexity.

Verify partition predicates in the generated SQL. A correctly partitioned base table still scans badly when the BI layer filters another field or makes the date optional.

Precompute when freshness permits it

Once a read pattern is stable, choose a rung from the precompute ladder.

A scheduled serving table is often enough. Materialized views fit narrower eligible shapes. Extracts trade another copy for predictable dashboard speed. BI Engine can accelerate a live workload after the query and table shape are sane.

State the freshness requirement first. Refreshing every minute against source data that changes hourly adds work without making the report fresher.

Isolate real reporting workloads

A dashboard used throughout the business may deserve its own project and reservation assignment so analyst exploration or batch work can’t dominate its latency. That isolation protects the workload from neighbours. It doesn’t make the workload efficient.

Monitor the reporting lane after isolation. If query count or bytes keep growing with no corresponding user or freshness need, fix the dashboard rather than adding capacity indefinitely.

Hold the dashboard owner accountable for warehouse behavior

Report design includes the workload it emits. Review query fan-out and cost alongside visual changes. A new tile isn’t free merely because the BI tool makes it easy to drag onto the canvas.

Use this sequence:

  1. observe generated workload
  2. remove duplicated logic and accidental variation
  3. shape a serving model
  4. precompute to the accepted freshness budget
  5. isolate or accelerate the remaining live work

Dashboards melt BigQuery when repeated interaction remains an unbounded live query pattern. The repair is a serving decision, not another round of blaming individual SQL.

More in this domain: Reporting

Browse all

Related patterns