Real-time analytics, measured
99,997,497 rows of real web analytics data, 43 queries that look like the ones dashboards and product analytics run, the same scripts on every system. Each query runs three times; the first is the cold run, the best of the other two is the hot run.
Query latency
Score: for each query, (time + 10 ms) ÷ (fastest time in the group + 10 ms), then the geometric mean over 43 queries. 1.0 means fastest on every query.
| System | Configuration | Hot score | Cold score | 43 queries, hot | Load time | On disk | Run date |
|---|---|---|---|---|---|---|---|
| ClickHouse | c6a.4xlarge · 16 vCPU · 32 GiB | 1.03 | 1.76 | 16.14 s | 195 s | 9.4 GB | 2026-11-07 |
| DuckDB | c6a.4xlarge · 16 vCPU · 32 GiB | 2.03 | 1.31 | 26.25 s | 126 s | 20.5 GB | 2026-05-11 |
| StarRocks | c6a.4xlarge · 16 vCPU · 32 GiB | 2.90 | 4.95 | 44.47 s | 489 s | 17.9 GB | 2026-09-07 |
| System | Configuration | Hot score | 43 queries, hot | Load time | On disk | Run date |
|---|---|---|---|---|---|---|
| ClickHouse Cloud | ClickHouse Cloud · 2 replicas × 64 GiB · AWS | 1.06 | 11.03 s | 35 s | 10.3 GB | 2026-11-07 |
| Amazon Redshift | Redshift Serverless | 2.77 | 19.74 s | 1,889 s | 30.3 GB | 2022-07-29 |
| BigQuery | On-demand · serverless | 4.89 | 27.33 s | 777 s | 8.8 GB | 2025-10-28 |
| Databricks SQL | SQL warehouse · Medium | 5.16 | 32.22 s | 53 s | 10.2 GB | 2025-11-13 |
| Snowflake | Medium warehouse · Gen2 | 5.66 | 60.32 s | 67 s | 13.0 GB | 2026-07-27 |
Seven queries up close
Hot-run time for individual ClickBench queries. The fastest time in each row is highlighted.
| Query | ClickHouse (c6a.4xl) | ClickHouse Cloud | Amazon Redshift | BigQuery | Databricks SQL | Snowflake | DuckDB (c6a.4xl) | StarRocks (c6a.4xl) |
|---|---|---|---|---|---|---|---|---|
Q1 · Full countSELECT COUNT(*) FROM hits; | 1 ms | 2 ms | 199 ms | 371 ms | 274 ms | 103 ms | 18 ms | 35 ms |
Q5 · Distinct usersSELECT COUNT(DISTINCT UserID) FROM hits; | 227 ms | 200 ms | 302 ms | 556 ms | 596 ms | 1.37 s | 348 ms | 354 ms |
Q13 · Top search phrasesSELECT SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; | 345 ms | 256 ms | 343 ms | 581 ms | 659 ms | 1.01 s | 408 ms | 665 ms |
Q21 · Substring scanSELECT COUNT(*) FROM hits WHERE URL LIKE '%google%'; | 367 ms | 276 ms | 235 ms | 473 ms | 571 ms | 1.53 s | 711 ms | 906 ms |
Q29 · Regex group-bySELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; | 1.52 s | 1.05 s | 799 ms | 1.03 s | 3.61 s | 13.19 s | 6.48 s | 9.71 s |
Q34 · High-cardinality group-bySELECT URL, COUNT(*) AS c FROM hits GROUP BY URL ORDER BY c DESC LIMIT 10; | 1.67 s | 1.20 s | 783 ms | 1.35 s | 2.05 s | 5.05 s | 2.05 s | 6.05 s |
Q43 · Dashboard time seriesSELECT DATE_TRUNC('minute', EventTime) AS M, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0 GROUP BY DATE_TRUNC('minute', EventTime) ORDER BY DATE_TRUNC('minute', EventTime) LIMIT 10 OFFSET 1000; | 9 ms | 17 ms | 283 ms | 426 ms | 331 ms | 132 ms | 39 ms | 51 ms |
Ingestion throughput
Rows per second for the one-time bulk load of the dataset, as each system’s ClickBench script performs it.
ClickBench measures a single bulk load, not continuous ingestion. For streaming workloads the deciding factors are how quickly a new row becomes queryable and what that costs; see the real-time ingestion row of the comparison.
Compression
Bytes on disk after loading the same 100M rows, as reported by each system. Smaller means cheaper storage and less I/O per query.
Concurrent queries
ClickBench’s concurrency test cycles through the query set from many clients at once and counts queries per second. Only runs with zero errors count.
DuckDB is a single-process engine and is not part of the concurrency test. The managed services have not published concurrency results to ClickBench.
Cost per 1,000 queries
Average hot-run time across the 43 queries × 1,000 × the hourly list price below, billed per second. A compute-only estimate; storage and egress are not included.
| System | Price basis | $/hour | $ per 1,000 queries | vs ClickHouse |
|---|---|---|---|---|
| ClickHouse | c6a.4xlarge on-demand, AWS us-east-1: $0.612/h | $0.61 | $0.064 | 1.0× |
| DuckDB | c6a.4xlarge on-demand, AWS us-east-1: $0.612/h | $0.61 | $0.104 | 1.6× |
| StarRocks | c6a.4xlarge on-demand, AWS us-east-1: $0.612/h | $0.61 | $0.176 | 2.8× |
| Snowflake | Medium warehouse, 4 credits/h at $2.00/credit (Standard) | $8.00 | $3.117 | 48.9× |
| Databricks SQL | Medium serverless SQL warehouse, 24 DBU/h at $0.70/DBU | $16.80 | $3.497 | 54.8× |
ClickHouse, DuckDB and StarRocks are priced as the EC2 instance they ran on; Snowflake and Databricks at the list price of the warehouse size that ran the benchmark. Discounts, reserved capacity, Snowflake’s 60-second resume minimum and idle time are not modelled. BigQuery and Redshift Serverless bill by bytes scanned and RPU capacity, which ClickBench does not record, so they are left out. ClickHouse Cloud bills by compute and storage usage; check its pricing page for your tier.
Where ClickHouse is not first
An honest reference shows these too.
- Cold runs on one machine: DuckDB scores 1.31 to ClickHouse’s 1.76 when caches are empty.
- Bulk load on one machine: DuckDB loaded the dataset in 126 s; ClickHouse took 195 s.
- Storage among managed services: BigQuery reported 8.8 GB, slightly under ClickHouse Cloud’s 10.3 GB.
- Some single queries: Redshift Serverless (2022 run) is fastest on Q21, Q29 and Q34 in the table above, and BigQuery edges ClickHouse Cloud on Q29.
None of these changes the overall picture: across all 43 queries, ClickHouse has the best hot score in both groups by a wide margin. Explore every system and machine size on ClickBench, or read our methodology.