Skip to content
Opensource internals
  • Posts

Performance

ClickHouse's LowCardinality Column Shares One Dictionary Across Millions of Rows

Oct 21, 2026 26 min read Jay Hubbert

LowCardinality(T) stores a dictionary of distinct values once and keeps a 1–8 byte index per row.

ClickhousePerformanceInternalsMemoryCompression

Read more →

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

Oct 21, 2026 13 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 25 min read Jay Hubbert

Underneath every ClickHouse data type there is exactly one data structure: a flat array of trivially-copyable elements. UInt64 is an array of UInt64. String is a flat character …

ClickhousePerformanceInternalsMemorySimd

Read more →

← Newer Page 3 of 8 Older →

© 2026 Jay Hubbert · Built with Hugo 0.168.0

RSS ·