Acumatica · Olap

OLAP Cubes in the Modern Era

How traditional MOLAP/ROLAP cubes compare to on-demand rollups in modern columnar warehouses like BigQuery, Snowflake, and DuckDB, and when pre-aggregation still earns its complexity.

John Kihiu12 min read

OLAP cubes — the MOLAP/ROLAP world of SSAS, Essbase, and Cognos TM1 — were built to solve a problem that no longer exists in quite the same shape: aggregating billions of rows fast enough for interactive slicing was hard on 2000s-era disk-based databases, so you pre-computed every rollup combination overnight into a cube and queried the cube instead of the raw fact table. Modern columnar warehouses changed the economics of that trade-off, but they didn't eliminate the underlying need — they just moved where the aggregation happens.

What a traditional cube actually is

A MOLAP cube pre-materializes aggregations across every combination of dimensions you define — region × product × time × customer segment, and so on — into a multidimensional structure optimized for fast slice-and-dice queries. ROLAP does the same conceptually but keeps the data in relational tables and computes aggregates via SQL rather than a proprietary storage engine. Both trade a slow, resource-heavy build process (the nightly cube processing job that data teams structured entire schedules around) for near-instant query response once built. The cost was rigidity: adding a new dimension or attribute meant reprocessing the cube, sometimes for hours, and cube-modeling tools like MDX were a specialized skill most analysts never learned.

What columnar, elastic-compute warehouses changed

BigQuery, Snowflake, and DuckDB store data in a columnar format and can scan and aggregate billions of rows in seconds by throwing parallel compute at the problem on demand, rather than requiring the aggregation to be pre-computed. A GROUP BY across region, product, and month that would have needed a pre-built cube in 2010 now just runs as a query, computed fresh, against the raw (or lightly modeled) fact table.

SQL · ON-DEMAND ROLLUP, NO CUBE NEEDED
SELECT
  region,
  product_category,
  DATE_TRUNC('month', order_date) AS month,
  SUM(revenue) AS total_revenue,
  COUNT(DISTINCT customer_id) AS active_customers
FROM fact_orders
GROUP BY ROLLUP(region, product_category, month)
ORDER BY region, product_category, month;

ROLLUP and CUBE as SQL grouping operators give you the same multi-level subtotal behavior a MOLAP cube provided, computed on the fly against current data, with no separate processing job and no risk of the cube being stale relative to the source tables.

When pre-aggregation still earns its complexity

The on-demand approach isn't free — it costs compute every single query, and at genuinely large scale (tens of billions of rows, dashboards refreshed by hundreds of concurrent users) re-scanning and re-aggregating on every page load gets slow and expensive fast. This is where materialized views, dbt incremental models, or purpose-built pre-aggregation tools still make sense: compute the rollup once on a schedule, store the result, and serve dashboard queries against the small pre-aggregated table instead of the billion-row fact table.

The decision is about query pattern, not data volume alone

A billion-row table queried by three analysts running ad hoc SQL a few times a day is usually fine unaggregated on Snowflake or BigQuery. The same table backing a customer-facing dashboard hit by 10,000 users a minute needs pre-aggregation regardless of absolute size — the deciding factor is concurrency and latency requirements, not row count on its own.

Semantic layers: dbt metrics and Cube.js

What survived from the cube era isn't the storage engine — it's the idea of a single, governed definition of what "revenue" or "active customer" means, so five different analysts querying five different tools get the same number. dbt's metrics/semantic layer and tools like Cube.js fill that role now: you define a metric once, with its dimensions and aggregation logic, and BI tools query the semantic layer rather than reimplementing the SQL themselves. It's the cube's real contribution — a shared, versioned definition of business logic — decoupled from the rigid, slow-to-rebuild multidimensional storage that used to be required to get it.

Don't rebuild a MOLAP cube's rigidity inside a semantic layer

The point of a modern semantic layer is that adding a new dimension doesn't require reprocessing anything — it's a metadata change, not a data rebuild. If your dbt metrics or Cube.js schema needs a multi-hour rebuild every time someone adds a filter, you've recreated the old cube's downside without its query-speed upside.

Wrapping up

The OLAP cube as a physical, pre-processed structure is mostly gone from new architectures — columnar warehouses made on-demand aggregation fast enough that most teams don't need it. What replaced it is a split: raw compute-on-demand for the common case, targeted pre-aggregation for genuinely high-concurrency or high-volume dashboards, and a semantic layer to keep the business logic consistent across both. If you're evaluating whether you need a "cube" in 2026, the honest answer is usually that you need a semantic layer, and only sometimes that you need pre-aggregated tables underneath it.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.