Real-time analytics databases
Columnar databases that make streaming events queryable within seconds and answer many small analytical queries at once, fast enough to sit behind an app.
11 technologies on this page ↓How it works
A real-time analytics database stores events column by column, like a warehouse, but it is built for a different workload: many small queries every second, from an app or an API, on data that is seconds old. Ingestion never stops. The database reads a stream such as a Kafka topic, or takes HTTP posts, and indexes new rows in memory, where queries can already see them. It then writes them out as immutable columnar files, called segments or parts, sorted by time and a key, and merges small files into bigger ones in the background. Queries stay fast because they read little. Indexes skip most of the data: Druid keeps a bitmap for every value of a column, ClickHouse a sparse index on the sort key, Pinot a star-tree of pre-aggregated values. Pre-aggregation shrinks it further: rows can be rolled up at ingestion (one row per minute per page instead of one per click), or a materialized view keeps running totals updated on every insert. Hot data sits on local disk or in memory, and the full copy usually lives in object storage. Compared with a warehouse, which loads in batches and spends a lot of compute on each big query from a few analysts, the goal here is freshness in seconds and hundreds or thousands of concurrent queries that each return in milliseconds, mostly against one wide event table; joins and row updates are weaker. Compared with a time-series database, which is organised around series (a metric plus tags) and retention, these systems expect high-cardinality columns such as user IDs and URLs and arbitrary filters and group-bys across many columns, although the two overlap.
The scoreboard in a stadium rather than the league’s archive. It changes within seconds of each play and thousands of people read it at once, because it shows running tallies kept up all game, not the footage of every play. The archive, like a warehouse, has everything, for slower and deeper questions afterwards.
Reach for it when
- Analytics inside your product: per-customer dashboards, usage meters and leaderboards that many users load at once
- Data that must be queryable seconds after it happens: ad spend, fraud signals, game or device events arriving on a stream
- Filters and group-bys over high-cardinality columns (user IDs, URLs, SKUs) answered in well under a second
- APIs that return aggregates at hundreds or thousands of queries per second
Think twice when
- Occasional analyst questions over years of history across many joined tables; a warehouse or lakehouse is cheaper and better at joins
- Records that change one by one by primary key: Druid can only overwrite whole time ranges, and most others make updates costly (Pinot’s upserts are the exception)
- Small data or few users: PostgreSQL with good indexes, or DuckDB, is far less to run
- You need every raw event later but plan to roll up at ingestion; rollup throws the detail away
A real example
An email platform shows each of its 20,000 customers a live opens-and-clicks dashboard. Delivery events, about 50,000 a second, flow through Kafka into ClickHouse, and a materialized view keeps counts per customer, campaign and minute. A dashboard load runs four queries filtered on customer_id; each reads a few thousand pre-aggregated rows and returns in about 20 ms, even at 1,000 queries a second during a big send. Raw events stay in the base table for 30 days, for drill-downs.
Technologies
Specific products, and what each does differently.
PivotOpen sourceA young open-source analytics server in Rust that speaks the PostgreSQL protocol and queries Iceberg and Delta Lake tables straight from object storage.
StarRocksOpen sourceAn open-source MPP analytical database with a vectorized engine that serves fast joins and real-time updates on its own tables, and also queries Iceberg, Hudi, Delta Lake and Hive tables in place.
TinybirdCommercialA hosted ClickHouse platform that turns SQL queries into authenticated REST API endpoints, for analytics inside your product.
CedarDBCommercialA PostgreSQL-compatible database rebuilt from scratch at TU Munich, running transactions and analytics on one copy of the data on a single server.Mainly Relational databases
ScramDBCommercialA brand-new, closed-source database that speaks the PostgreSQL protocol and promises transactions, analytics and vector search on one copy of the data; first builds shipped in summer 2026.Mainly Relational databases
DatabendOpen sourceA cloud data warehouse written in Rust that keeps every table as Parquet blocks and Git-like snapshots in object storage, so stateless compute clusters can start, scale and stop without moving data. Open core: Apache 2.0, with paid features under the Elastic License 2.0.Mainly Data warehouses| Commercial product | Alibaba Cloud | Proprietary (managed service only) | 2026-10-06 | |
| Open source | Apache Software Foundation | Apache 2.0 | 2026-10-10 | |
| Open source | Apache Software Foundation | Apache 2.0 (GPLv2 until February 2015) | 2026-10-06 | |
| Commercial product | Firebolt Analytics Inc. | Proprietary. Firebolt Core, the free self-hosted engine, ships as binaries only under the Elastic License 2.0 (source-available terms, not OSI open source; a custom licence before July 2025). SDKs, dbt adapter and Kubernetes operator are Apache 2.0 | 2026-10-06 | |
Pivot | Open source | Epsio Labs | MIT or Apache 2.0, at your option | 2026-10-06 |
StarRocks | Open source | StarRocks Project (Linux Foundation), led by CelerData, now PhoenixAI | Apache 2.0 (Elastic License 2.0 until December 2022) | 2026-10-06 |
Tinybird | Commercial product | Tinybird | Proprietary (TypeScript SDK MIT-licensed) | 2026-10-06 |
CedarDB | Commercial product | CedarDB GmbH | Proprietary; the free Community Edition comes under CedarDB’s own terms (64 GiB data limit, no modification or redistribution) | 2026-10-06 |
ScramDB | Commercial product | ScramDB Labs | Proprietary, closed source; free single-node Community edition capped at 64 GiB, Enterprise licence key required for clustering; no published licence agreement found | 2026-10-06 |
| Open source | ClickHouse, Inc. | Apache 2.0 | 2026-10-05 | |
Databend | Open source | Databend Labs | Apache 2.0 for the core; enterprise features (src/query/ee, src/meta/ee, BendSave) are under the Elastic License 2.0 and need a paid license key. Both ship in the same binary | 2026-10-11 |
What each provider calls it
- AWS
- No dedicated service. Redshift streaming ingestion lands Kinesis or MSK data in materialized views; OpenSearch Service covers log and event analytics; otherwise people run ClickHouse, Druid or Pinot on EC2 or EKS, or use ClickHouse Cloud or Imply Polaris, which run on AWS
- Google Cloud
- No dedicated service either: BigQuery with the Storage Write API for streaming rows and BI Engine’s in-memory cache for dashboard queries; or ClickHouse Cloud or Tinybird in Google Cloud regions
- Azure
- Azure Data Explorer and Eventhouse in Microsoft Fabric Real-Time Intelligence (both queried with KQL): streaming ingestion, answers in milliseconds to seconds
- Open source & others
- ClickHouse, Apache Druid, Apache Pinot, StarRocks, Apache Doris; as services: ClickHouse Cloud, Tinybird (on ClickHouse), Imply (Druid), StarTree (Pinot), PhoenixAI (formerly CelerData, StarRocks), Firebolt, Alibaba Cloud Hologres; also CedarDB (one engine for transactions and analytics); early: Pivot (Postgres protocol over Iceberg and Delta tables), ScramDB (pre-release)
In code · sql
-- ClickHouse: raw events, sorted the way customers ask about them
CREATE TABLE events (
ts DateTime,
customer_id UInt32,
page String,
duration_ms UInt32
) ENGINE = MergeTree
ORDER BY (customer_id, ts);
-- A rollup kept current on every insert: one row per customer, page and minute
CREATE TABLE page_minutes (
minute DateTime,
customer_id UInt32,
page String,
views UInt64,
total_ms UInt64
) ENGINE = SummingMergeTree
ORDER BY (customer_id, page, minute);
CREATE MATERIALIZED VIEW page_minutes_mv TO page_minutes AS
SELECT toStartOfMinute(ts) AS minute, customer_id, page,
count() AS views, sum(duration_ms) AS total_ms
FROM events
GROUP BY minute, customer_id, page;
-- What one customer’s dashboard asks, many times a second
SELECT page, sum(views) AS views, sum(total_ms) / sum(views) AS avg_ms
FROM page_minutes
WHERE customer_id = 4812 AND minute >= now() - INTERVAL 1 HOUR
GROUP BY page
ORDER BY views DESC
LIMIT 10;Worth exploring
Benchmarks
How to read a benchmark →Often confused with
Where it came from1993–2021
E. F. Codd coined “OLAP” in 1993, in a paper written for Arbor Software, maker of the Essbase cube database. Classic OLAP meant cubes: aggregates computed ahead of time from a warehouse and browsed by analysts. They were fast, but the data was hours old and only the planned dimensions could be sliced.
Internet companies with floods of events needed more. In 2011 Metamarkets, which sold ad analytics dashboards, found relational databases too slow for arbitrary drill-downs, while pre-computing aggregates into a key-value store took over 24 hours as dimensions grew. It built Druid, a column store with bitmap indexes that made streaming events queryable at once. LinkedIn built Pinot for member-facing features such as Who Viewed Profile, and Yandex open-sourced ClickHouse, born in web analytics, in 2016.
These systems moved analytics from a few analysts to end users: thousands of people at once, on data seconds old. Druid and Pinot became top-level Apache projects in 2019 and 2021, StarRocks and Apache Doris followed, and most are now also sold as managed services.
Why it’s built this way
- Query raw or lightly rolled-up events, not pre-built cubes
- Cubes limited users to reports someone had planned, and rebuilding them took hours. Metamarkets needed any combination of dimensions at sub-second latency, so Druid aggregated only lightly at ingestion and computed the rest at query time.
- Make new rows queryable while still in memory
- Druid’s real-time nodes kept an in-memory index that queries could read directly, then periodically persisted it to columnar files and handed finished segments to other nodes. Data was visible within seconds without waiting for a batch load.
- Indexes that skip data instead of scanning it
- Many concurrent queries are only affordable if each touches little data. Druid borrowed bitmap indexes from search engines, ClickHouse keeps a sparse index on the sort key, and Pinot’s star-tree index stores pre-aggregated results across several columns.
- Keep the master copy in shared storage
- Druid writes immutable segments to deep storage such as S3 or HDFS, and query servers only cache them. A failed server is replaced by downloading segments again, and even a whole cluster can be rebuilt.
Timeline
- 1993
E. F. Codd coins the term OLAP
- 2011
Metamarkets introduces Druid for real-time ad analytics
- 2012
Druid is open-sourced in October
- 2016
Yandex open-sources ClickHouse
- 2018
Pinot, built at LinkedIn, enters the Apache Incubator
- 2019
Druid becomes a top-level Apache project
- 2021
Pinot graduates to a top-level Apache project
- Wikipedia: Online analytical processing (Codd, 1993, Arbor Software and Essbase; supplement)
- Eric Tschetter (Metamarkets): Introducing Druid, real-time analytics at a billion rows per second (April 2011)
- Eric Tschetter (Metamarkets): Introducing Druid, the open-source release (October 2012)
- Yang et al.: Druid, A Real-time Analytical Data Store (SIGMOD 2014)
- Apache Pinot docs: Introduction (originally built at LinkedIn)
- ClickHouse: Our story (open-sourced in 2016)
- Apache Incubator: Druid project status (graduated 2019-12-18)
- Apache Incubator: Pinot project status (entered 2018-10-21, graduated 2021-07-21)
Sources26
- Apache Druid docs: Introduction (real-time ingestion, bitmap indexes, sub-second queries)
- Apache Druid docs: Segments (columnar files, dictionaries, bitmaps)
- Apache Druid docs: Data rollup
- Apache Druid docs: Data updates (no single-record updates by primary key)
- Apache Druid docs: Architecture (deep storage, Historicals caching segments)
- Apache Pinot docs: Introduction (user-facing analytics, streaming ingestion)
- Apache Pinot docs: Stream ingestion with upsert
- Apache Pinot docs: Star-tree index
- ClickHouse docs: A practical introduction to primary indexes (sparse index)
- ClickHouse docs: Incremental materialized views (a trigger on inserted blocks)
- ClickHouse docs: SummingMergeTree
- ClickHouse Cloud docs: Architecture (AWS, GCP, Azure)
- Amazon Redshift docs: Streaming ingestion to a materialized view (Kinesis, MSK)
- Amazon OpenSearch Service docs: What is Amazon OpenSearch Service?
- Imply: Polaris pricing (AWS regions)
- BigQuery docs: Introduction to the Storage Write API
- BigQuery docs: Introduction to BI Engine
- Tinybird docs: ClickHouse interface (AWS and GCP regions)
- Microsoft Learn: What is Azure Data Explorer?
- Microsoft Learn: Eventhouse overview (Fabric Real-Time Intelligence)
- StarRocks docs: Architecture
- PhoenixAI: StarRocks (formerly CelerData)
- Apache Doris: real-time analytics database
- StarTree docs: StarTree Cloud, built on Apache Pinot
- Firebolt: analytical database
- Alibaba Cloud: Hologres