Skip to main content
TPC-H runs on the data-warehouse domain’s duckdb-local reference platform (a provider-less, single-node engine, the sibling of the tpc-ds suite). It has two modes selected by params.mode:
  • reference (default) — run the 22 queries once (single stream), digest each result, emit queries.json + summary.json. Cheap CI/offline path, scored by official-tpch-evaluator.
  • official — the full official pipeline (Load → Power incl. RF1/RF2 → multi-stream Throughput → ACID), emitting official.json scored by official-tpch-qphh-evaluator into the official QphH@Size composite.
Official-mode numbers reproduce the official TPC-H formulas but are unaudited: no TPC membership, no audit, no priced full-disclosure report. The RF1/RF2 refresh set is clousight-generated. Every score says so in its notes.

Run reference mode (no cloud account)

Run official mode (QphH@Size)

Official mode requires selecting its evaluator (both evaluators support tpc-h; the reference one is chosen by default):

Scaling up

params.scale_factor sets the size (QphH is reported @Size), and params.streams sets the number of concurrent Throughput query streams. It defaults to the official minimum for the scale factor (SF1 → 2, SF10 → 3, SF30 → 4, SF100 → 5, …). All three composites scale with SF, and Throughput@Size grows with the stream count. The query-stream permutations come from params.query_order:
official fails loudly if you ask for more streams than the shipped Appendix A table covers — it never silently substitutes an unofficial order. Use query_order: generated to scale past S = 2 (each stream still runs all 22 queries, so the throughput metric is correct; only strict comparability to a published run needs the exact Appendix A sequences). The chosen ordering is recorded in official.json as ordering_source and folded into the run’s dataset digest.

What official mode measures

The official-tpch-qphh-evaluator emits these tpc-h.* measurements: Official mode makes no correctness claim: the Power test’s queries run AFTER RF1 has refreshed the data, so their results legitimately differ from the pristine-data references — comparing them would mislabel correct behavior as failure. Correctness (verified against the official answers) rides the reference mode. ACID Durability is reported as n/a (no crash/recovery harness on embedded DuckDB) and therefore omitted from the measurement set. ACID is an independent pass/fail gate — it is not part of the QphH@Size composite. All carry official=True — a provenance flag (“emitted by the suite’s recognized evaluator”), not an audit claim; drift is carried by reproducibility_class.

Correctness: verified official answers

The pinned references for SF 1, 0.1 and 0.01 were each verified cell-by-cell against DuckDB’s official tpch_answers() answer set at capture time (all 22 queries, numeric cells at the shared 2-dp rounding, order-insensitive rows) — queries_passed at those scale factors says so in its notes. Other scale factors carry no correctness claim until you capture a reference (scripts/capture_tpch_reference.py --sf <sf>); still not an audited TPC result.

Price/performance (price/QphH)

Supply your system price through the pricing feed and the pricing enricher emits the official-style composite (unaudited — the price is your own input, e.g. a 3-year TCO or a monthly subscription):
A record whose tpc-h.qphh_at_size matches (and provider/region filters, when given) gains extensions.pricing.price_performance[] with price_per_unit_perf = price / QphH. The bundled seed ships no system prices — a price/perf number never comes from invented data, and it can never change the verdict (enrichers are additive by contract).

Out of scope (today)

Real-SUT config-connect engines (duckdb-local only), and extending the official Appendix A permutation table beyond streams 0–2 (use query_order: generated to scale in the meantime). Very large scale factors are bounded by single-node DuckDB memory/disk. Durability crash-recovery is not tested on embedded DuckDB.