Same SQL. Same data. Verified identical.
the scoreboard
Two comparisons, each between like and like: the in-process, in-memory engines (HoloDb embedded and DuckDB), and the networked services (HoloDb's server and SQL Server). Identical billing queries — single-table rollups and cross-table JOINs — over identical data (10,000,000 invoices ⋈ 200,000 customers), loaded into each engine through its own bulk path. Every result is verified byte-for-byte identical across every engine before timing; figures are the median of many runs on 16 cores.
6 rollups in µs
The billing dashboard — revenue by status, month and region, plus totals, counts and lookups — resolves in microseconds from maintained accumulators. Response time holds constant as the ledger grows.
15 of 16
As a networked service, HoloDb outperforms SQL Server on 15 of the 16 billing queries — every rollup and scan (by up to ~32,000×) and all five cross-table joins.
joins at parity
The five cross-table JOINs run parallel across all cores: HoloDb wins revenue by segment and lands within ~1.4–3.3× of DuckDB on the rest (down from 15–92× before). DuckDB keeps a modest edge on the heavy single-table scans.
In-process, in memory — HoloDb (embedded) vs DuckDB (in-process), 10M invoices ⋈ 200k customers, median ms
| billing query | HoloDb | DuckDB | faster |
| revenue by regionSELECT region, SUM(amount_cents) … GROUP BY region | 0.004 | 48.6 | HoloDb ~12,000× |
| invoices by statusSELECT status, COUNT(*), SUM(amount_cents) … GROUP BY status | 0.006 | 59.0 | HoloDb ~9,800× |
| total invoicedSELECT SUM(amount_cents) FROM invoices | 0.002 | 2.95 | HoloDb ~1,500× |
| invoice countSELECT COUNT(*) FROM invoices | 0.001 | 0.98 | HoloDb ~980× |
| revenue by monthSELECT month, SUM(amount_cents) … GROUP BY month | 0.011 | 7.11 | HoloDb ~650× |
| look up one invoiceSELECT … WHERE invoice_id = ? | 0.005 | 0.61 | HoloDb ~120× |
| big-ticket invoices (>$5k)SELECT COUNT(*) … WHERE amount_cents > 500000 | 6.40 | 3.85 | DuckDB ~1.7× |
| revenue by region & statusGROUP BY region, status (multi-column) | 129.7 | 76.8 | DuckDB ~1.7× |
| top customers by revenueGROUP BY customer_id … ORDER BY SUM(amount_cents) DESC LIMIT 10 | 321.7 | 162.0 | DuckDB ~2.0× |
| largest invoicesORDER BY amount_cents DESC LIMIT 20 | 11.8 | 4.48 | DuckDB ~2.6× |
| overdue outstandingSELECT SUM(amount_cents) … WHERE status = 'overdue' | 82.7 | 14.1 | DuckDB ~5.8× |
| revenue by segment (JOIN)invoices ⋈ customers GROUP BY customers.segment | 56.7 | 65.6 | HoloDb ~1.2× |
| revenue by segment & status (JOIN)⋈ customers GROUP BY customers.segment, invoices.status | 135 | 94.9 | DuckDB ~1.4× |
| enterprise revenue (JOIN)invoices ⋈ customers WHERE customers.segment = 'enterprise' | 34.3 | 10.3 | DuckDB ~3.3× |
| revenue by signup cohort (JOIN)⋈ customers GROUP BY customers.signup_month | 44.0 | 15.3 | DuckDB ~2.9× |
| top named customers (JOIN)invoices ⋈ customers … GROUP BY customers.name … LIMIT 10 | 808 | 322 | DuckDB ~2.5× |
The six rollups and the point lookup resolve from maintained accumulators and the primary-key index — no scan, hence microseconds, thousands of times faster, and flat as the ledger grows. On the single-table scans (a filtered sum, a top-K, a multi-column group) DuckDB's purpose-built columnar engine keeps a modest lead. The five cross-table JOINs now fan out in parallel across all cores: HoloDb wins revenue by segment and lands within ~1.4–3.3× of DuckDB on the rest — down from 15–92× before the joins were parallelised — all verified identical, and beats SQLite and (as a server) SQL Server outright. Bulk load, rows/sec: DuckDB 916k · HoloDb 359k.
Networked service — HoloDb server vs SQL Server 2022 (LocalDB), 10M invoices ⋈ 200k customers, median ms
| billing query | HoloDb server | SQL Server | faster |
| invoices by statusSELECT status, COUNT(*), SUM(amount_cents) … GROUP BY status | 0.124 | 4,032 | HoloDb ~32,000× |
| revenue by monthSELECT month, SUM(amount_cents) … GROUP BY month | 0.153 | 2,965 | HoloDb ~19,000× |
| revenue by regionSELECT region, SUM(amount_cents) … GROUP BY region | 0.134 | 2,575 | HoloDb ~19,000× |
| total invoicedSELECT SUM(amount_cents) FROM invoices | 0.129 | 1,156 | HoloDb ~9,000× |
| invoice countSELECT COUNT(*) FROM invoices | 0.138 | 589 | HoloDb ~4,300× |
| largest invoicesORDER BY amount_cents DESC LIMIT 20 | 7.42 | 3,001 | HoloDb ~405× |
| big-ticket invoices (>$5k)SELECT COUNT(*) … WHERE amount_cents > 500000 | 4.20 | 689 | HoloDb ~164× |
| revenue by region & statusGROUP BY region, status (multi-column) | 131.7 | 3,260 | HoloDb ~25× |
| overdue outstandingSELECT SUM(amount_cents) … WHERE status = 'overdue' | 83.2 | 1,004 | HoloDb ~12× |
| top customers by revenueGROUP BY customer_id … ORDER BY SUM(amount_cents) DESC LIMIT 10 | 285.8 | 3,277 | HoloDb ~11× |
| enterprise revenue (JOIN)invoices ⋈ customers WHERE customers.segment = 'enterprise' | 39.7 | 1,792 | HoloDb ~45× |
| revenue by segment & status (JOIN)⋈ customers GROUP BY customers.segment, invoices.status | 140 | 6,556 | HoloDb ~47× |
| revenue by segment (JOIN)invoices ⋈ customers GROUP BY customers.segment | 57.5 | 2,946 | HoloDb ~51× |
| revenue by signup cohort (JOIN)⋈ customers GROUP BY customers.signup_month | 67.6 | 2,853 | HoloDb ~42× |
| top named customers (JOIN)⋈ customers GROUP BY customers.name … LIMIT 10 | 806 | 4,173 | HoloDb ~5.2× |
| look up one invoiceSELECT … WHERE invoice_id = ? | 0.20 | 0.20 | tie (~0.2 ms) |
Both are networked services paying a client/server round-trip. HoloDb's server holds the working set in memory with the same maintained accumulators; SQL Server 2022 (LocalDB) reads its on-disk table. HoloDb leads on 15 of the 16 — every rollup and scan by 11× to 32,000×, and all five JOINs by 5× to 51× now that they fan out in parallel across all cores (the heaviest, the name-grouped join, lands at 806 ms against SQL Server's 4,173 ms) — conceding only the sub-millisecond point lookup. Bulk load, rows/sec: HoloDb server 697k · SQL Server 349k.
HoloDb is built for the mixed workload: a transactional ACID store, durable and larger-than-memory, that also resolves dashboard rollups in microseconds and runs vector search — in a single embeddable dependency. Full methodology & every number →