A category of software tools that provide analysis of data stored in a database, typically for multi-dimensional business reporting.
If you've ever written SELECT region, SUM(revenue) FROM fact_sales GROUP BY region and had it return in under a second over 5 billion rows, thank OLAP. That's the whole category in one sentence: databases built for aggregations and scans, not transactions. Every cloud warehouse you've heard of — Snowflake, BigQuery, Redshift, Databricks SQL — is an OLAP system. So is ClickHouse, Druid, DuckDB, and any analytics engine that stores data in columns instead of rows.
The OLAP-vs-OLTP distinction shapes almost every architectural decision in a data platform. You don't run dashboards off Postgres not because Postgres is bad — it's excellent at OLTP — but because scanning a billion rows to aggregate revenue will either timeout or lock the table against the application writing into it. Putting OLAP and OLTP workloads on the same database is the oldest data-engineering mistake, and the one that keeps generating CDC-to-warehouse pipelines decades after it should have been obvious.
At a SaaS company I worked with, the product team had built the analytics dashboard on the transactional MySQL primary. It ran fine for the first 18 months. Then the user base grew, dashboard queries started taking 30+ seconds, and table scans began causing replication lag that broke product features. The fix wasn't query optimization — MySQL just isn't an OLAP engine for that scale. Fix: stream MySQL CDC to Snowflake, point dashboards at Snowflake, return MySQL to doing what it's good at. Response times went from 30 seconds to 400ms, and the production database stopped being a bottleneck. That's the OLAP/OLTP split in action.
OLAP (Online Analytical Processing) is a category of database technology optimized for complex analytical queries — aggregations, groupings, window functions, and multi-dimensional analysis across large datasets. OLAP systems are designed to answer questions like 'What was total revenue by region and product category last quarter?' in seconds, even over billions of rows.
| Aspect | OLAP (Analytical) | OLTP (Transactional) |
|---|---|---|
| Purpose | Analysis and reporting | Day-to-day transactions |
| Queries | Complex aggregations, joins | Simple CRUD (insert, update) |
| Data Volume | Billions of rows | Thousands of concurrent rows |
| Optimization | Read-heavy (scans) | Write-heavy (point lookups) |
| Storage | Columnar | Row-oriented |
| Examples | Snowflake, ClickHouse, BigQuery | PostgreSQL, MySQL, Oracle |
| Users | Analysts, data scientists | Application users |
| Type | How It Works | Best For |
|---|---|---|
| MOLAP (Multidimensional) | Pre-computed cubes stored in specialized format | Fastest queries, smaller datasets |
| ROLAP (Relational) | Queries run on relational tables at query time | Flexibility, large datasets |
| HOLAP (Hybrid) | Combines MOLAP for summaries + ROLAP for details | Balance of speed and flexibility |
| Engine | Type | Key Strength |
|---|---|---|
| Snowflake | Cloud DW | General-purpose analytics |
| BigQuery | Serverless | Ad-hoc queries at scale |
| ClickHouse | Column store | Real-time analytics, sub-second queries |
| Apache Druid | Real-time OLAP | Event data, high concurrency |
| Apache Pinot | Real-time OLAP | User-facing analytics |
| DuckDB | Embedded | Local/embedded analytics |
-- Multi-dimensional analysis: revenue by region, category, quarter
SELECT
d.quarter,
c.region,
p.category,
SUM(f.revenue) AS total_revenue,
COUNT(DISTINCT f.customer_id) AS unique_customers,
SUM(f.revenue) / COUNT(DISTINCT f.customer_id) AS revenue_per_customer
FROM fact_sales f
JOIN dim_date d ON f.date_key = d.date_key
JOIN dim_customer c ON f.customer_key = c.customer_key
JOIN dim_product p ON f.product_key = p.product_key
WHERE d.year = 2026
GROUP BY ROLLUP(d.quarter, c.region, p.category)
ORDER BY total_revenue DESC;
Things to know when designing OLAP workloads in 2026:
OLAP (Online Analytical Processing) is a class of databases built for analytical queries — aggregations, groupings, and scans over millions-to-billions of rows — as opposed to OLTP databases built for individual transactions. In practice, when you write a `GROUP BY region SUM(revenue)` query over a fact table and it returns in seconds, you're using an OLAP engine. Snowflake, BigQuery, Redshift, Databricks SQL, ClickHouse, and DuckDB are all OLAP. Postgres, MySQL, and Oracle are primarily OLTP, though they can run analytics at small scale.
OLTP (Online Transactional Processing) databases handle application workloads — small, frequent inserts/updates/point-lookups with ACID guarantees. Postgres, MySQL, Oracle. OLAP databases handle analytical workloads — large scans and aggregations, few writes, optimized for read concurrency. Snowflake, BigQuery, ClickHouse. Under the hood, OLTP uses row-oriented storage (efficient for reading whole rows) while OLAP uses columnar storage (efficient for reading a few columns across many rows). In any serious data platform you'll run both, connected by CDC or ETL.
Yes — Snowflake is one of the flagship cloud OLAP systems. It uses columnar storage (micro-partitions), compute/storage separation, vectorized execution, and clustering for fast aggregations over billions of rows. It's not designed for OLTP workloads like application backends; you won't get good performance from a million inserts per second of single-row writes. Snowflake Hybrid Tables (formerly Unistore) add some transactional capabilities for mixed workloads but are a different product tier, not a replacement for a Postgres primary.
An OLAP cube is a multidimensional pre-aggregation of measures along hierarchies of dimensions (time, geography, product, etc.). In the Microsoft Analysis Services / SSAS era, cubes were rebuilt nightly and queries hit cube structures rather than raw data. Modern columnar engines (Snowflake, BigQuery, ClickHouse) aggregate fast enough at query time that explicit cubes are largely obsolete — star-schema fact tables + materialized views cover most of the same use cases with less complexity. Cubes still show up in legacy Microsoft BI stacks and in some specialty OLAP tools (Kyligence, AtScale) targeting extreme-latency requirements.
These are the classic OLAP terms from the cube era: roll-up aggregates to a higher level (daily → monthly → yearly), drill-down goes deeper (country → state → city), slice fixes one dimension (Q1 2026 only), dice fixes multiple (Q1 2026 + North America + Electronics), and pivot rotates the view (swap rows/columns). In modern SQL-based OLAP, these map directly to GROUP BY + ROLLUP/CUBE/GROUPING SETS, WHERE filters, and PIVOT/UNPIVOT. You won't see these words in a modern data-engineering job description, but the operations are still exactly what BI dashboards do under the hood.
For general-purpose cloud warehousing with strong governance and ease of operations, Snowflake and BigQuery are the default choices. For ultra-low-latency analytics (sub-100ms response, high concurrency) use ClickHouse, Druid, or Pinot. For lakehouse-first architectures where data lives in Iceberg/Delta on S3, use Databricks SQL or Snowflake with external tables. For local analytics and embedded use cases, DuckDB is excellent. For on-prem or self-hosted with no vendor lock, ClickHouse is the strongest open-source choice. The right answer depends on team skills, budget, and latency requirements more than on any single engine being "best."
For small data — up to maybe 50-100M rows — Postgres with good indexes handles analytical queries acceptably. Past that, scans and aggregations get slow because Postgres is row-oriented and lacks vectorized execution for aggregations. Extensions like Citus (columnar), TimescaleDB (hypertables), and pg_duckdb (embedded DuckDB) add OLAP capabilities. For serious analytics over hundreds of millions or billions of rows, move to a purpose-built OLAP engine — the performance gap is 10-100x and the operational gap (compute/storage separation, zero-copy clones, elastic scaling) is bigger than the technical one.