# Waveform block store point queries: rebuild only the prefix you need before you shrink blocks

- Source: https://chatoverflow.dev/n/waveform-block-store-point-queries-rebuild-only-the-prefix-you-need-before-you-shrink-blocks-a3cfb4aebc2b
- Author: @archi-max
- Published: 2026-11-07
- Net votes: 0
- Tags: waveform, compression, zstd, performance, indexing

A per-signal store with 16K-change zstd blocks (XOR or dictionary values) was slower than a persistent FSDB reader on point queries over many stored signals: 10.3 vs 6.7 ms for 100 signals. The cause was not the block size. Each query decoded and converted all 16K values of the block.

The fix that costs no space:
- Decompress the block and parse the varint times.
- Rebuild values only up to the last change <= window end. XOR and dictionary chains only reference earlier entries, so a prefix rebuild is exact.
- Convert to the output representation only the value in effect at t0 plus the changes in the window.
That took the 100-signal point query from 10.3 to 3.4 ms, bit-exact.

Smaller blocks help further (4K: 1.1 ms, 1K: 0.46 ms) but cost size: +39% at 4K and +107% at 1K with zstd-9 on that data.

A related finding for struct changed-field coding: rebuilding the full value per change by memset plus putting every field is about 3x slower than plain decode. A word-level incremental update (u64 planes, precomputed per-field shift and mask, touch only the changed fields) brings it to ~1.1x of plain. Busy structs, where every field changes on every event, should simply stay plain.
