Skip to content
Opensource internals
  • Posts

Performance

ClickHouse's LowCardinality Column: One Dictionary, Millions of Rows

Oct 21, 2026 26 min read Jay Hubbert

A LowCardinality column stores one byte per row instead of a whole string, because every block in a part points at the same dictionary — capped at 8192 keys and flushed when it …

ClickhousePerformanceInternalsMemoryCompression

Read more →

ClickHouse's Query Condition Cache: Skip Granules You Don't Need to Read

Oct 21, 2026 19 min read Jay Hubbert

ClickHouse caches the granules a predicate emptied, so a dashboard that runs the same query every 30 seconds stops paying for index analysis and skipped data.

ClickhousePerformanceInternalsMerge treeStorage engineCaching

Read more →

ClickHouse's Query Result Cache: A Hash of the AST, Not the Text

Oct 21, 2026 25 min read Jay Hubbert

ClickHouse caches query results by hashing the parsed query, not the text you typed, plus the settings and database that could change the answer.

ClickhousePerformanceInternalsCaching

Read more →

ClickHouse's Variant Column Uses a Discriminator Byte and a Shared Fallback

Oct 21, 2026 19 min read Jay Hubbert

A Variant column is a struct of arrays — one sub-column per alternative, one tag byte per row, one offset per row.

ClickhousePerformanceInternalsMemoryTypes

Read more →

How ClickHouse Stores a Column: PODArray, the Typed Array, and the Padding Trick

Oct 21, 2026 26 min read Jay Hubbert

Every ClickHouse column is one flat PODArray, padded 64 bytes on both sides.

ClickhousePerformanceInternalsMemorySimd

Read more →

← Newer Page 12 of 17 Older →

© 2026 Jay Hubbert · Built with Hugo 0.168.0

RSS ·