---
title: "A faster alternative to DuckDB"
description: "DuckDB set the bar for querying Parquet on one machine. We put CtrlB next to it on ClickBench, same hardware, same file, same 43 queries. CtrlB is ahead on the hot run on both instances we tested, and the gap sits somewhere specific. Why we benchmarked against DuckDB DuckDB is what most people…"
canonical: "https://ctrlb.ai/blogs/a-faster-alternative-to-duckdb"
publishedTime: "2026-08-27"
modifiedTime: "2026-08-27T11:01:35+0000"
author: "Adarsh Srivastava"
tags: []
---

# A faster alternative to DuckDB

### DuckDB set the bar for querying Parquet on one machine. We put CtrlB next to it on ClickBench, same hardware, same file, same 43 queries. CtrlB is ahead on the hot run on both instances we tested, and the gap sits somewhere specific.

![](https://images.prismic.io/ctrlb-new/zHdhNKrDFyitWmzz_Screenshot2026-08-27at2.47.33PM.png?auto=format,compress)

## **Why we benchmarked against DuckDB**

DuckDB is what most people reach for when they have a Parquet file and a question. Nothing to deploy, nothing to load, and it is fast. 

ClickBench is the place to settle it. It is public, every submission lives in a Git repository as a shell script, and anyone can rerun them. CtrlB and DuckDB both have entries in the _Parquet, single_ category, which means one unpartitioned file, no preloading, no indexes, and no engine specific flags.

Here is what came back.

## **How it was measured**

Both entries run the stock ClickBench harness and both are marked untuned on the leaderboard. Nothing here is a custom configuration.

| Parameter / Feature | Specification Details |
| --- | --- |
| Dataset | hits.parquet |
| Storage | Single unpartitioned file (hits.parquet), 13.77 GiB (identical across engines) |
| Benchmark Scope | 43 standard analytical SQL queries (table scans, range aggregations, multi-key GROUP BY, string transformations, regular expressions, high-cardinality ranking) |
| Execution Protocol | 3 runs per query: Cold (1st run) vs. Hot (best of 2nd & 3rd runs) |
| Timing Metric | Client-side wall clock for full round-trip (includes total result payload transfer) |
| Target Field | Untuned entries in ClickBench single-node Parquet category on CPU hardware |
| Hardware Environment | AWS c6a.2xlarge (8 vCPU, 16 GiB RAM) & c6a.4xlarge (16 vCPU, 32 GiB RAM), 500 GB gp2 EBS |
| CtrlB Entry | Run date: July 28, 2026 |
| DuckDB Entry | Run date: May 11, 2026 |

Result 1 of 3

## **c6a.2xlarge, combined metric**

Combined is what the leaderboard shows by default. Sixty percent of it is the hot run, twenty percent the cold run, and ten percent each for load time and storage size.

![](https://images.prismic.io/ctrlb-new/ArYy-v5R9zXaJ_6P_ChatGPTImageAug27%2C2026%2C02_34_32PM.png?auto=format,compress)

**CtrlB** finishes first at ×1.35, **DuckDB** next at ×1.38, **Clickhouse** at ×1.47. Two percent apart, which reads as a tie if the summary bar is all you look at. So do not stop at the summary bar. The per query numbers further down are where the two engines actually part company.


Result 2 of 3

## **c6a.2xlarge, hot run**

The hot run is the best of the second and third execution with the page cache warm. It is what a dashboard refresh looks like, or the fourth query in a row while you are chasing something down.

![](https://images.prismic.io/ctrlb-new/TzXfx2DFxYKryoB6_Screenshot2026-08-27at2.54.39PM.png?auto=format,compress)

Take the cold start out and the picture separates. CtrlB posts ×1.49 against DuckDB at ×1.65. Eleven percent in geometric mean across all 43 queries.

## **c6a.4xlarge, hot run**

The 4xlarge is ClickBench's reference instance: 16 vCPU and 32 GiB, twice the compute of the 2xlarge for the same 14 GB of Parquet.

![](https://images.prismic.io/ctrlb-new/2c7yONBrsv8afQV__Screenshot2026-08-27at2.56.26PM.png?auto=format,compress)

CtrlB posts ×1.56 against DuckDB at ×1.63. The margin narrows as cores are added, which is the expected shape: with more parallelism available, the scan heavy queries that dominate the suite converge, and the queries where CtrlB pulls ahead are the ones that were never scan bound to begin with.


Result 3 of 3

## **c6a.4xlarge, hot run**

Twice the cores, same 14 GB file. This is ClickBench's reference instance.

![](https://images.prismic.io/ctrlb-new/mFgsR9zx9FGBAfKj_Screenshot2026-08-27at3.13.13PM.png?auto=format,compress)

CtrlB ×1.56, DuckDB ×1.63. The gap tightens to four percent, which tracks. Most of the suite is scan bound, and scans are exactly what more cores fix. The queries where CtrlB pulls clear were never scan bound, so there is less headroom to show it once everything else has sped up too.

## **Where the difference lives**

A geometric mean crushes 43 queries into one number and throws away the part worth reading.

![](https://images.prismic.io/ctrlb-new/M7cQcLnuJ6SJtfZX_Screenshot2026-08-27at3.59.17PM.png?auto=format,compress)

CtrlB's wins cluster at the fast end of the suite. Counts, filtered counts, bounded scans, and the minute level rollup at the end. Q0 is a plain COUNT(*): 8 ms on CtrlB against 51 ms on DuckDB. Q42 buckets page views by minute behind four predicates and an offset: 22 ms against 84 ms.

Forty milliseconds is not much on its own. It is the difference between a panel that is already there when you look at it and one you watch arrive.

![](https://images.prismic.io/ctrlb-new/p4am_AFMYZ4rm4Wb_Screenshot2026-08-27at3.19.20PM.png?auto=format,compress)

Across the whole suite, CtrlB returns seven of the 43 queries in under 50 ms on both instances. DuckDB returns none. Under 100 ms it is thirteen queries against seven on the 2xlarge.

![](https://images.prismic.io/ctrlb-new/vI6i4mr0aqoxuqLI_Screenshot2026-08-27at4.01.23PM.png?auto=format,compress)

## **Check it yourself**

Everything above comes off the public leaderboard. These links open the exact views the charts are drawn from.

c6a.2xlarge, combined metric

c6a.2xlarge, hot run

c6a.4xlarge, hot run

![](https://images.prismic.io/ctrlb-new/zBso5Lnjoj7NvA8K_Screenshot2026-08-27at3.25.05PM.png?auto=format,compress)
