New: prepared statements, UPDATE and DELETE, and key lookups that seek — 0.143 ms through the gateway.Read the update

Benchmark report · Analytics

TPC-H on columnar collections, SF 0.1

The same five TPC-H queries on row and columnar storage: columnar is 2.5–7.3× faster than row storage, 11–46× slower than single-threaded DuckDB, answers equal.

Run details

Date
Commita69b309 (clean tree). Earlier raw lines labelled 47d56fd came from an uncommitted working tree and are superseded.
Hoststtiz, shared production VPS under the uf-remote caps: 3 CPUs, 6 GB.
Toolscripts/tpch-run 0.1 3 row and scripts/tpch-run 0.1 3 columnar (crate uf-tpch). The columnar load compacts, advances the GC horizon and compacts the LSM, as a steady-state system would. Same data and comparison method as the 21 October report.
Raw results
docs/bench/results/tpch-runs.jsonl
Reportdocs/bench/2026-10-22-tpch-columnar.md

Indicative only. Measured on a shared development host with other services running, one node, data that fits in memory. These figures show direction, not performance to expect. The claims policy requires a dedicated host before any target is published.

Results

The tables, as written

Transcribed from the report without rounding. Bracketed values are the previous measurement where the report gives one.

Row storage vs columnar vs DuckDB 1.1.3 on one thread, seconds

QueryRow storage (s)Columnar (s)Columnar gainDuckDB 1 thread (s)Columnar vs DuckDBAnswers
Q10.8690.3082.8×0.012824×equal
Q30.7100.1664.3×0.008520×equal
Q50.8960.3632.5×0.007846×equal
Q60.5350.0747.3×0.002036×equal
Q100.7710.2453.1×0.022911×equal

Seconds per query, log scale

Row storage, columnar storage and DuckDB on one thread; commit a69b309

Row Columnar DuckDB 1 thread
0.0010.010.11Row Q1: 0.869 sColumnar Q1: 0.308 sDuckDB 1 thread Q1: 0.0128 sQ1Row Q3: 0.71 sColumnar Q3: 0.166 sDuckDB 1 thread Q3: 0.0085 sQ3Row Q5: 0.896 sColumnar Q5: 0.363 sDuckDB 1 thread Q5: 0.0078 sQ5Row Q6: 0.535 sColumnar Q6: 0.074 sDuckDB 1 thread Q6: 0.002 sQ6Row Q10: 0.771 sColumnar Q10: 0.245 sDuckDB 1 thread Q10: 0.0229 sQ10
What changed

Before and during this run

  • Columnar collections (P3c): rows arrive as usual and are compacted into row groups whose columns are packed by type; a query reads only the columns it needs.
  • Both columns include the P2e+ executor changes made in this phase (digit counting, typed group keys).
  • Two things found while measuring went into spec §5.7: compaction markers moved out of the delta rows into their own subspace, because every scan walked them; and deleted row keys leave LSM tombstones until the GC horizon passes them, so the benchmark advances it after loading.
Reading

What the numbers say

The report's own reading, including what went wrong and what is still open.

  • Before P2d the same queries took 3.3–4.3 s, so they are now 10×–44× faster in three phases, with answers always equal.
  • In one profiling run (uf-tpch profile, not recorded in the jsonl), reading two columns of lineitem's row groups took about 15 ms, so the remaining gap is the executor rather than storage: per-row validity vectors, row-at-a-time hash joins and group keys, no SIMD, and a single thread.
  • That is the next executor work on the way to the 3× goal (ADR-004). The gate is not met.
  • Correctness alongside: a columnar-vs-row differential over at least 1 000 generated plans; ten million ufdiff plans, 0 failures; mutation pass 9 of 9; 354 workspace tests.
Reproduce

Files and tools

Report

docs/bench/2026-10-22-tpch-columnar.md in the repository.

Raw results

docs/bench/results/tpch-runs.jsonl

Access

The repository is private during development. Early-access teams receive the build, the benchmark scripts and the raw files.

See the measurements in context.

The performance page draws the latest figure from each area and states what is not measured yet.