OLTP systems handle transactions, OLAP systems handle analytics. In 2026, CDC pipelines, HTAP engines, and real-time OLAP have blurred that line - here is where one engine works and where you still need two.
At some point every backend needs to do two things that hate each other: record transactions and scan them. One workload inserts orders, updates profiles, and decrements inventory with strict correctness, thousands of times a second. The other reads months of those orders to compute revenue by region or a retention curve. The first is OLTP, the second is OLAP, and since Codd coined the second term in 1993 the advice has been to keep them apart, because the storage layout that makes one fast makes the other slow.
That advice still holds. What changed is the cost of keeping them apart. Change data capture now moves rows from a transactional database into an analytical engine in seconds, real-time OLAP engines serve sub-second queries to thousands of concurrent users, and "hybrid" engines promise to do both at once. So the question has shifted from "OLTP or OLAP" to "which of the patterns below fits this workload".
The split, briefly
OLTP engines (PostgreSQL, MySQL, Aurora) handle high volumes of short concurrent reads and writes against current state: insert an order, update an email, fetch a row by primary key, all under ACID, with point reads in well under a millisecond and commits in single-digit milliseconds. OLAP engines (ClickHouse, Snowflake, BigQuery, Pinot, Druid) run aggregations over large volumes of history: sums, group-bys, percentiles, joins across billions of rows.
The split falls out of two opposing storage decisions. OLTP databases store data row by row, so every column of one record sits together on disk and a single read returns the whole entity. OLAP databases store data column by column, so a query touching three of fifty columns reads only those three, and long runs of similar values compress well. ClickHouse claims 5x to 10x compression over row-oriented databases for this reason (ClickHouse). Run an analytical scan on a row store and you drag every column off disk to use a fraction of them. Run point updates on a column store and you rewrite compressed column files to change one row. Each engine is pathologically bad at the other's job.
| Dimension | OLTP | OLAP |
|---|---|---|
| Primary workload | Short transactions: insert, update, point lookup | Aggregations, scans, group-by over large datasets |
| Schema | Normalized, many tables | Denormalized / star schema, wide tables |
| Storage layout | Row-oriented | Columnar |
| Query pattern | Read/write a few rows by key | Scan millions to billions of rows |
| Concurrency | Thousands of small concurrent transactions | Fewer, heavier queries (or many small ones for user-facing analytics) |
| Latency target | Sub-millisecond point lookups | Sub-second to seconds per scan |
| Example engines | PostgreSQL, MySQL, Aurora | ClickHouse, Snowflake, BigQuery, Pinot, Druid |
If your workload sits cleanly on one side, this table is most of the answer. Our database selection guide and the ClickHouse vs PostgreSQL comparison cover the cases where it does not.
Where the Line Breaks Down
The clean separation assumes analytics runs on yesterday's data and a handful of analysts run the queries. Plenty of workloads break both assumptions.
User-facing analytics is the clearest example. Embed a dashboard inside your product, a usage chart for every customer or a fraud score on every transaction, and you have an analytical query pattern (scan and aggregate) with an OLTP concurrency and latency profile: thousands of users, sub-second responses, fresh data. Operational dashboards on live event streams have the same shape. The question is analytical, but "how fresh" is now measured in seconds rather than nightly batch windows.
The freshness expectation is what pushed the industry toward the patterns below. Nobody wanted to merge OLTP and OLAP into one box for its own sake. They wanted to close the gap between a write landing in the transactional system and that write showing up in analytics. See also our guide to data warehouse architecture in 2026 for the OLAP side of the split.
The Pattern That Won: CDC From OLTP Into OLAP
In the platforms we build and audit, the architecture most teams land on keeps two purpose-built engines and connects them with change data capture (see also: modern data platform reference architecture). PostgreSQL or MySQL serves writes. ClickHouse, Snowflake, or BigQuery serves analytical reads. A CDC pipeline tails the transactional database's write-ahead log and streams every insert, update, and delete into the analytical store within seconds.
Debezium through Kafka is the open-source standard for this, and managed connectors have made it close to turnkey. ClickHouse's ClickPipes Postgres CDC connector reached general availability in May 2025 with replication latency as low as 10 seconds (ClickHouse blog); ClickHouse also claims an initial 1 TB snapshot in about 2 hours with 8 parallel threads (ClickHouse). On the cloud side, Amazon's Aurora zero-ETL integration replicates from Aurora into Redshift within seconds of the transactional write, generally available for Aurora MySQL since late 2023 and for Aurora PostgreSQL since October 2024 (AWS).
Each engine keeps doing the one thing it is good at. The OLTP database is not slowed by analytical scans, because those run on a separate system fed by the log. The OLAP database is never asked to do point updates, because it receives an ordered stream of changes it can merge in the background. A reference architecture for a typical SaaS backend:
Aurora / PostgreSQL (OLTP: writes, point reads)
│ write-ahead log
▼
CDC connector (Debezium / ClickPipes / PeerDB)
│ ordered change events, ~seconds latency
▼
ClickHouse / OpenSearch (OLAP: dashboards, search, aggregations)
The market agrees. In mid-2025 Databricks bought Neon (Databricks) for a reported $1 billion, and Snowflake bought Crunchy Data for a reported $250 million (CNBC, The Register). Snowflake had already tried converging the two sides with Unistore hybrid tables, and then bought a real Postgres anyway. Databricks turned Neon into Lakebase, a managed Postgres that sits next to the lakehouse rather than inside it.
The trade-off is operational. You now run two systems and a pipeline, and a row that just committed in Postgres may be a few seconds away from appearing in ClickHouse. For most analytics that delay is invisible; for a workflow that reads its own write and expects exact agreement, you design around it.
What actually bites in production is more specific than "eventual consistency". Schema changes on the source: a new column or a type change that the connector does not propagate, and the sink silently drops or nulls it. Deletes: the CDC stream carries a delete event, and your ClickHouse table needs a ReplacingMergeTree with a version and is_deleted column (or a CollapsingMergeTree with a sign column). Queries then need FINAL or an explicit is_deleted = 0 filter, because background merges keep the latest delete marker rather than dropping it, so deleted rows stay in your counts indefinitely without one of those. Postgres REPLICA IDENTITY: without FULL, an update that does not touch a TOAST-ed column (large text or JSONB) leaves that column out of the change event, so the sink receives a placeholder or null and can overwrite good data. FULL fixes it, at the cost of more WAL. Backfills: re-snapshotting a multi-terabyte table while the stream keeps flowing means reconciling snapshot rows with in-flight changes, and a replication slot that is left unconsumed during that window will fill the source's disk unless you cap it with max_slot_wal_keep_size. None of this is exotic, but every one of them has paged someone at 3am. Our Debezium in production guide covers the fixes.
If your "OLAP" side is really search and log analytics, the same shape applies with OpenSearch as the sink; the boundary cases are covered in using Elasticsearch or OpenSearch as your primary datastore.
HTAP and OLTP-Side Analytics: When One Engine Is Enough
The competing idea is to avoid the second system. Two flavors exist, and both have a real but narrow place.
The first is HTAP: one engine serving both workloads, usually by keeping a row store for writes and a columnar replica for analytics inside the same system. TiDB (TiKV replicating to TiFlash), SingleStore, and SAP HANA are the well-known examples. The promise is no pipeline and no lag. The reality is contention: the same CPU, memory, and I/O serve writes pulling one way and scans pulling the other. Snowflake documents a soft ceiling of roughly 16,000 operations per second per database for its Unistore hybrid tables (80/20 read/write mix; higher requires contacting Support) and a 2 TB hybrid-table storage quota per database (Snowflake docs). That is enough for many applications, but a single well-tuned Postgres or MySQL instance routinely exceeds it. HTAP earns its keep when the time between a transaction and its analytical visibility matters more than peak performance on either side, and when volumes stay modest.
The second flavor is OLTP-side analytics: keep Postgres, lean on replicas and extensions. A read replica absorbs reporting queries. TimescaleDB adds time-series compression and continuous aggregates. Citus shards for parallel scans. Columnar extensions narrow the scan-efficiency gap. For datasets in the tens of gigabytes and dashboards that tolerate a second or two, this is good enough, and a second engine would be premature. The point where Postgres stops keeping up (billions of rows, high-concurrency sub-second aggregations, scans no index can rescue) is where teams move to ClickHouse; we lay out that threshold in ClickHouse vs PostgreSQL and ClickHouse vs Snowflake.
Choosing: Match the Engine to the Workload
- Pure transactional: point reads and writes, strict consistency, modest reporting? A single OLTP database (PostgreSQL, Aurora). Do not add an analytical system you do not need.
- Pure analytical: large scans, batch loads, a handful of analysts? A dedicated OLAP warehouse (ClickHouse, Snowflake, BigQuery) on its own.
- Both, and the analytical side is large or high-concurrency? Two engines plus CDC. Postgres or Aurora for writes, ClickHouse or OpenSearch for analytics, fed by Debezium, ClickPipes, or PeerDB (or Redshift fed by Aurora zero-ETL).
- Both, but volumes are modest and you want one system? HTAP (TiDB, SingleStore) or Postgres with replicas and extensions. Accept the ceiling on each workload in exchange for one less moving part.
Two mistakes we see over and over. Running heavy OLAP queries on the production OLTP database starves transactions of I/O and locks; one analyst's group-by can spike P99 for paying users. Running OLTP-style point updates on a columnar engine is the mirror failure: column stores rewrite compressed files on update and have no business serving a write-heavy load. When a workload sits in the middle, split it by access pattern and connect the halves with a pipeline.
If you are weighing CDC pipelines, HTAP, or a Postgres-plus-ClickHouse split, BigData Boutique designs and operates these architectures in production. Get in touch and we will help you match the engine to the workload.