What general-purpose compression forbids
What does general-purpose compression forbid, and what does each escape cost?
The standing questions, and an organizational constraint
What does this system assume that it cannot verify? That the distribution of the data still looks like the data used to choose the level, the block size and the dictionary. Nothing checks this. When a new customer arrives with UUIDs where there used to be a few enum values, the ratio silently halves, and the result shows up months later as storage growth and slower queries, never as an error. Compression fails by degrading, and that is the kind of failure that organizations are worst at detecting. You should alert on compression ratio per column as a data-quality signal. Almost nobody does.
Who pays when the assumption breaks? Here the constraint is not physical or informational. It is organizational. The producer pays the CPU for compression. The consumer receives the benefit in bandwidth and latency. In most companies these are different teams with different budgets. The ingest team is measured on throughput and cost per ingested GB, so it picks level 1 and moves on. The query team is measured on p99, and complains about scan times. The setting that would improve the whole system makes one team's number worse. So the technically correct level is systematically under-chosen, and no benchmark fixes this, because benchmarking was never the bottleneck.
Compression is the clearest case of money buying position on another axis. Cores can be bought, and compression turns bought cores into fewer bytes at a computable rate, but the cores and the bytes come from different budgets.
This has the same shape as schema contracts: the producer bears the cost of keeping the contract, and the consumer receives the benefit. That is why schemas rot most in organizations where the producing team is busiest.
You cannot have compression and addressability together. Once the bytes are entropy-coded, there is no value i; there is only a block. Everything that comes after (block sizing, restart frames, independent chunks) is damage control for a property you gave up on purpose. The same number governs how much redundancy you find, how much you decode to read one row, how much you lose to one bad bit, and how much parallelism you get.
The escapes and their prices
- Smaller blocks buy back access granularity and limit the blast radius. They cost ratio and table overhead.
- Independent frames buy back parallelism. They cost ratio at every boundary.
- Trained dictionaries buy back ratio on small inputs. They cost a permanent coordination dependency.
- Skipping the pass entirely buys back CPU. It is correct more often than people think, when the pipe is fast.