docs: refresh benchmarks.md from the 2026-08-12 run (ClickBench win 33->25, #452 trade, #595) - #596
Conversation
Re-ran the full harness (main suite 6M rows + FSST + joins + cross-engine ClickBench) on main at 2fe6596, pg18n non-assert, 16 cores/62 GB, and updated every measured section. The substantive changes: - ClickBench columnar-vs-heap win count 33/6/4 -> 25/13/5, because commandprompt#452 phase-2 decode gating shipped and is a selectivity trade: +1.8x on q24 (its case), -1.2..2x on eight less-selective queries. Documented with an A/B and filed as the follow-up commandprompt#595. - Load gap restated as a serial-path property (columnar 2.38x serial / 1.73x bulk vs Citus), columnar still smallest on disk (1.48 GB). - parallel_flush is a measured opt-in, not eventually-default (commandprompt#445 slice 4). - commandprompt#452 phase 1+2, anchored LIKE (commandprompt#510), detoast-once (commandprompt#587), FSST verdict cache (commandprompt#472), bloom by distinct count (commandprompt#467) recorded in 'what changed'. - Noted commandprompt#423 (q21 unsupported byval length) is resolved -- q21 no longer errors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017N82wDmsawqSWoWkmxtHmW
jdatcmd
left a comment
There was a problem hiding this comment.
Request changes — one blocking gate, then this is good to merge. The substance is accurate and the honesty about my own #452 regression is exactly right.
Blocking: the CI red is real, and it is docs_style
The "suites (PG 17)" / "suites (PG 18)" failures are not a timeout or infra flake this time. docs_style is a registered suite, and this refresh introduces STE violations that fail it. I verified by attribution, not assumption:
ste_check.pyon main'sbenchmarks.md:ok(clean).ste_check.pyon this branch'sbenchmarks.md:FAIL — 17 long, 6 prose double-hyphen.
So the refresh introduced them; they are not pre-existing. A docs-only PR can legitimately turn the suite job red, and here it does. Representative hits:
- 41 words: "It is a large win on a wide
SELECT *under a highly selective filter (q24 from 6098 ms to 3395 ms ...)" - 38 words: "This is why the ratio against heap falls as the number of rows rises, from 64 times ..."
- 38 words: "Do not compare absolute milliseconds.** This run is on a larger machine ..."
- 31 words: "It helps a wide bulk load of many numeric columns by up to about 14 percent and regresses ..."
- 27 words: "Detoast once (#587). A toasted text value is now detoasted a single time per scan ..."
- The 6 prose double-hyphens include the
--in the #452 blockquote ("a wideSELECT *under a highly selective filter --", "q11 ... q32, each about 1.2 to 2x --") and the q21 line ("q21 no longer errors --").
Fix: split the 17 sentences under 25 words and restructure the 6 -- into separate sentences (the same STE discipline the rest of docs/ already meets). python3 test/ste_check.py docs/benchmarks.md prints the full list; green there turns the suite job green.
Substance: accurate, and I checked the part that is mine
The #452 phase-2 trade is reported correctly. Phase 2 evaluates the executor qual per 1024-row vector even when nothing is skippable, so it costs on less-selective scans and pays off only under a selective filter over a wide row. The A/B (gating on vs off) is the right instrument, the eight attributed regressions (q11/q12/q14/q15/q25/q27/q31/q32, ~1.2–2x, recovering with gating off while q24 loses its win) match the mechanism, and 33→25 with #595 tracking the selectivity gate is the correct disposition. Calling it "a deliberate trade, not a regression to hide" is the right call — thank you for not burying it.
The three judgment calls you flagged
- Derived ClickBench aggregates (totals + geomeans). Keep them — a derived aggregate beats a blank. One ask: label them as derived (e.g. a one-line "totals and geomeans computed from the per-query rows; the harness does not emit aggregates") so a later reader does not mistake them for harness output, and re-verify the geomean once against the 43 rows. I did not independently re-sum all 43 here, so I am not vouching for the arithmetic, only for the decision to publish them.
- The two dissonant historical paragraphs (import/export ~18x vs new ~3.4x; the Mutation "previous record" note). Annotate, do not drop — one clause each pinning them to their run and machine so the numbers do not read as comparable to the 2026-08-12 figures.
- Keeping the 2026-08-05 subsection as annotated history. Correct — a second independent run is worth keeping, and annotating where #423 resolved q21 is the right touch.
Nothing else blocks. Fix the STE gate and I will approve.
|
The STE gate is the only thing between this and merge. The "suites (PG 17/18)" red is not a flake or a timeout:
So the refresh created them. The substance is already right and I have signed off on it, including the honest #452 phase-2 trade and #595 as the tracked fix. Push the STE fix and I will re-review and approve. |
The refresh introduced 17 over-25-word sentences and 6 prose double-hyphens that ste_check.py (the docs_style suite) rejects. Split the long sentences at clause boundaries and restructure the double-hyphens into separate sentences. No numeric value, ratio, byte count, issue id or query id changed -- verified the numeric token multiset is identical before and after. ste_check.py now reports ok. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017N82wDmsawqSWoWkmxtHmW
|
Fixed the STE gate ( No numbers moved. I verified independently of the sentence edits: the multiset of every numeric/ratio/byte/ |
jdatcmd
left a comment
There was a problem hiding this comment.
STE fix verified: ste_check.py on the updated benchmarks.md now reports ok (was 17 long + 6 prose double-hyphen), and the CI suites are green — docs_style passes. The substance survived the rewrite intact: q24 6098->3395, win 33->25, #595 tracked, the totals/geomeans, and the #452 trade blockquote split into short sentences with nothing dropped (the runtime-probe note is sharper for it). My changes-requested is resolved. Approving.
Refresh benchmarks.md from a full 2026-08-12 run on current main
Re-ran the whole harness on
mainat2fe6596, pg18n non-assert, 16 cores/62 GB: main suite (6M rows, median of 5), FSST, joins (#401, 20M), and cross-engine ClickBench (11.1M-row stride sample, heap/columnar/columnar_tuned/citus/duckdb). Every measured table is updated from the raw output; not-re-measured sections (TSBS, read-stream/AIO, parallel) keep their prior attributions.The substantive change: ClickBench win count 33 → 25, and why
Columnar now beats heap on 25/43 (was 33), because #452 phase-2 decode gating shipped since the last run. An A/B on this build/data (gating on vs off) attributes it precisely: gating helps q24 1.8x (its target — a wide
SELECT *under a selective filter, 6098→3395 ms) but regresses eight less-selective queries 1.2–2x (q11/q12/q14/q15/q25/q27/q31/q32), because it evaluates the qual per vector even when nothing is skippable. It's a deliberate trade, documented as such, with the fix (gate the gating on selectivity — runtime probe) filed as #595 (prototype in progress).Other updates: load gap restated as a serial-path property (columnar 2.38x serial / 1.73x bulk vs Citus, still smallest on disk at 1.48 GB);
parallel_flushdocumented as a measured opt-in, not eventually-default (#445 slice 4); anchored LIKE (#510), detoast-once (#587), FSST verdict cache (#472), bloom by distinct count (#467) in "what changed". Noted that #423 is resolved — q21 no longer errors in the fresh run.Judgment calls flagged for review (I did not want to guess)
🤖 Generated with Claude Code
https://claude.ai/code/session_017N82wDmsawqSWoWkmxtHmW