Raw baseline context: 100M u64 = 800 MB; this Mac’s bandwidth ≈ ? GB/s
(check topic 0 baselines) → raw sum floor ≈ ? s.
| shape | encoding | predicted vs raw (faster/slower, ×) | actual |
| sorted low-card | rle sum (no decode) | | |
| sorted low-card | rle decode+sum | | |
| shuffled low-card | dict sum (codes only) | | |
| small-range random | bitpack decode+sum | | |
| question | prediction | actual |
| best raw-equiv GB/s seen (does anything beat the memory bus?) | | |
| sizes: rle / dict / bitpack per shape | | |
| dict “codes only” sum: bound by 4-byte code reads or the counts array? | | |
Surprises / dead ends:
| query | time | rows pruned by zone maps | hot column compression (storage_info) |
| Q0 | | | |
| Q3 | | | |
| Q8 | | | |
| Q13 | | | |
| Q20 | | | |
- BtrBlocks sampling vs full analyze — what sampling risks:
- fetch_row on DELTA_FOR — cost, and why OLAP tolerates it:
- RLE vs dict on 50% NULLs (validity changes the answer how):
- Zone-map always-true (filter removal) — when it beats skipping:
- Bitpacking mode for graph node-id payload columns:
- Worst-case over-read for a point query (granularity 8192, 3 cols):
- Why marks need two offsets:
- ORDER BY (user_id,ts) vs (ts,user_id) — zone maps on col 2:
- Too-eager vs too-lazy merging — topic 4 analogue:
- Part-equivalent for mergeable property segments + SummingMergeTree-style degree stats:
- Why Arrow has ~no encodings (what delta breaks for kernels):
- RLE-hybrid rationale + worst case vs PLAIN:
- BYTE_STREAM_SPLIT = columns-beat-rows one level down:
- Truncated string max stats — the increment-the-prefix bug:
- M12 optional properties: validity bitmap vs roaring presence, 1% vs 99%:
- Run-shortcuttable aggregates (min/max/count/avg yes-ish; distinct/median?):
- What made ClickHouse projections affordable when C-Store’s weren’t:
- WS/RS/tuple-mover → topic 4 vocabulary map:
- Position lists vs bitmaps — selectivity crossover:
- Process-compressed plan for
n.country = 'IL' at 1% selectivity:
- URLs / country codes / UUIDs — winner per case + cascade for URLs:
- Why FSST’s table must be static:
- Ingest-cost/ratio/burden triangle: sample vs analyze vs declare:
- FSST worst-case inflation vs RLE-hybrid worst case:
- String property cascade + where predicate-on-encoded works:
- Where ClickHouse barely wins and why:
- Merge-starvation failure mode — topic 4 stall analogue:
- Part-shipping vs WAL-shipping tradeoffs:
- M12 decision: who chooses encodings for graph property columns
(declare / analyze / sample) — commit + reason:
- clickhouse-local vs DuckDB niche:
- Compression IS performance because analytics is memory-bound —
topic 11’s bandwidth lesson cashed in.
- MergeTree = topic 4’s LSM with scan-shaped choices (sparse index,
merge-time work); “too many parts” = write stalls.
- Selection vectors / late materialization = C-Store position lists —
same idea, three names, twenty years.
- Vector-type flags (topic 11) = SIGMOD ’06’s compressed-block API.
- fetch_row constraint = why zstd loses to lightweight encodings —
random access shapes the menu (LMDB/B-tree echo from topic 3).
- All encoding tests green; scan_bench table filled; at least one
encoding beats the memory bus (raw-equiv GB/s > bandwidth).
- ClickBench-on-DuckDB table filled.
- M12 encoding-chooser decision written.