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 SF 0.1 vs DuckDB through P2d, P2e

Five TPC-H queries at SF 0.1: answers equal DuckDB's but 137–1 408× slower at first; projected scans and vectorized expressions got them to 37–255× that day.

Run details

Date
Commit2d70123 (first table), 2837a9d (after P2d), 535509b (after P2e), per docs/bench/results/tpch-runs.jsonl
Hoststtiz, shared production VPS under the uf-remote caps: 3 CPUs, 6 GB.
Toolscripts/tpch-run 0.1 3 (crate uf-tpch). Data: DuckDB v1.1.3 CALL dbgen(sf=0.1), lineitem 600 572 rows, loaded into one UltraFabric engine directory (one tenant, TPC-H primary keys) in 5.1 s. UltraFabric runs each query as ufd does: verify, optimize, re-verify, execute (median of 3, including planning). DuckDB time is per query excluding process start (median of 3). Answers compared with DuckDB's: decimals exactly, AVG within relative 1e-9.
Raw results
docs/bench/results/tpch-runs.jsonl
Reportdocs/bench/2026-10-21-tpch-sf0.1.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.

At the P2c gate

QueryRowsUltraFabric (s)DuckDB 1 thread (s)DuckDB 3 threads (s)Ratio vs 1 threadAnswers
SCAN (count(*) lineitem, profile baseline)12.9210.00020.0004— (DuckDB answers from metadata)equal
Q144.2780.01230.0058348×equal
Q3103.5470.00640.0052557×equal
Q553.5450.00510.0071693×equal
Q613.2690.00230.00101 408×equal
Q10203.5360.02580.0216137×equal

After P2d (projected scans, typed decimals), same host and data

QueryBefore P2d (s)After P2d (s)DuckDB 1 thread (s)Ratio vs 1 threadAnswers
SCAN (lineitem, profile baseline)2.9210.569 (5.1×)——equal
Q14.2782.3000.0120192×equal
Q33.5471.0160.0065156×equal
Q53.5451.1570.0056209×equal
Q63.2691.2580.0023552×equal
Q103.5361.1620.023150×equal

After P2e (vectorized expressions, batch aggregation, L11 above security chains)

QueryBefore P2d (s)After P2d (s)After P2e (s)DuckDB 1 thread (s)Ratio vs 1 threadAnswers
Q14.2782.3001.1650.012692×equal
Q33.5471.0160.6810.0061111×equal
Q53.5451.1570.8810.0056156×equal
Q63.2691.2580.5370.0021255×equal
Q103.5361.1620.7770.020837×equal

Seconds per query, log scale

UltraFabric at the P2c gate, after P2d, after P2e; DuckDB 1.1.3 on one thread

P2c gate After P2e DuckDB 1 thread
0.010.11P2c gate Q1: 4.278 sAfter P2e Q1: 1.165 sDuckDB 1 thread Q1: 0.0126 sQ1P2c gate Q3: 3.547 sAfter P2e Q3: 0.681 sDuckDB 1 thread Q3: 0.0061 sQ3P2c gate Q5: 3.545 sAfter P2e Q5: 0.881 sDuckDB 1 thread Q5: 0.0056 sQ5P2c gate Q6: 3.269 sAfter P2e Q6: 0.537 sDuckDB 1 thread Q6: 0.0021 sQ6P2c gate Q10: 3.536 sAfter P2e Q10: 0.777 sDuckDB 1 thread Q10: 0.0208 sQ10

Q1, Q6 and Q10 across the day, seconds

Three phases of executor work on the same host and data

Q1 Q6 Q10
0.02.34.6P2c gateAfter P2dAfter P2e
What changed

Before and during this run

  • First table: the executor as it stood at the P2c gate. Planning is 1–8 ms and catalog load 0.04 ms per query.
  • P2d (projected scans, typed decimals): the scan decodes only the columns a plan can observe, straight into column batches. Pruning needs a PROJECT above the security chain; decimals are typed i128 columns.
  • P2e (vectorized expressions, batch aggregation, the L11 rule above security chains): removed value-by-value gathers, comparisons, decimal arithmetic and row-based aggregation, plus the per-value clone in the normal-form check.
Reading

What the numbers say

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

  • All five answers equal DuckDB's; the 3× gate is not met. The profile and the plan are in docs/adr/004-p2-tpch-gate.md.
  • After P2d the SCAN baseline read one column (the best case) and gained 5.1×; the queries read 3–7 columns and gained 1.9×–3.5×. What remained in Q1 and Q6 was filter and expression evaluation running per row.
  • After P2e the five queries were 3.7×–6.1× faster than before P2d. What remained was dominated by reading and decoding the row store (SCAN baseline 0.40 s): the columnar-storage step, P3c.
  • Correctness alongside: ten million differential plans with pruning, 0 failures; 9 of 9 mutants caught.
Reproduce

Files and tools

Report

docs/bench/2026-10-21-tpch-sf0.1.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.