Skip to content
Opensource internals
  • Posts

Internals

ClickHouse's Query Pipeline: Ports, Status Codes and the Executing Graph

Oct 21, 2026 20 min read Jay Hubbert

ClickHouse doesn’t call operators in a fixed order. Every processor reports a status — ‘I need data’, ‘my output is full’, ‘call my work()’ — and the executor walks the…

ClickhouseInternalsQuery executionConcurrency

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 →

How ClickHouse's Sparse Column Stores Only the Rows That Differ

Oct 21, 2026 20 min read Jay Hubbert

Real columns are mostly default. A status column is 'active' for 98% of rows and '' for the rest. A retries column is 0 almost always. An amount column that is Nullable is NULL for …

ClickhousePerformanceInternalsMemoryCompression

Read more →

← Newer Page 4 of 24 Older →

© 2026 Jay Hubbert · Built with Hugo 0.168.0

RSS ·