列存引擎内核:ClickHouse 与 DuckDB 源码级拆解
读者理解 PostgreSQL 行存 OLTP 与 LSM 写优化引擎 之后,仍缺 读优化列存 的完整内核拆解。ClickHouse 是开源列存工程标杆;DuckDB 代表嵌入式分析路径——两者对照覆盖 OLAP 主战场。
本系列不写 SQL 教程,写:
- 列存 part 在磁盘上如何组织
.bin/.mrk/.idx - 一次 SELECT 如何从 part 读到向量批(Block)
- MergeTree 的 merge 在合并什么、为何是列存「心脏手术」
- PRIMARY KEY 在 ClickHouse 里为何不是唯一约束
- 生产环境 parts 过多、merge 跟不上、mutation 阻塞如何排查
系列状态:已完成(2026-06-18)。16 篇全部可读。
版本锚定:ClickHouse 24.x LTS;DuckDB 1.x。源码引用标注 release tag。
适合谁看
- 数据平台 / OLAP 工程师:维护 ClickHouse 集群或设计 ingest 管道。
- 从 PG/MySQL 转的 DBA:理解排序键、merge、mutation 与 B-Tree 的差异。
- 嵌入式分析开发者:评估 DuckDB、pg_duckdb 与 ClickHouse 分工。
- SRE:parts、副本延迟、OOM 排障。
推荐阅读路径
| 路径 | 篇目 | 适合 |
|---|---|---|
| OLAP 开发者 | 1 → 2 → 4 → 5 → 7 | 理解读写 |
| 平台/运维 | 1 → 6 → 8 → 14 → 15 → 16 | 集群稳定 |
| 嵌入式分析 | 11 → 12 → 13 | DuckDB |
| 从 PG 来 | 1 → 7 → 5 + PG B-Tree | 索引语义差异 |
| 完整通读 | 1 → … → 16 | 系统掌握 |
一、六个关键问题
- 列存文件在磁盘上长什么样? → 第 1、2 章
- 一次 SELECT 如何从 part 读到向量批? → 第 3、4、5 章
- MergeTree 的 merge 到底在合并什么? → 第 6 章
- ClickHouse 的「索引」是什么? → 第 7 章
- 分布式表如何工作? → 第 8、9 章
- 列存生产环境会出什么事故? → 第 14–16 章
二、篇目依赖
flowchart TD
A["01 列存基础"] --> B["02 Part 格式"]
B --> C["03 压缩与编码"]
C --> D["04 向量化执行"]
D --> E["05 查询读取路径"]
B --> F["06 Merge 与 Mutation"]
F --> G["07 索引与跳数索引"]
G --> H["08 ReplicatedMergeTree"]
H --> I["09 Distributed"]
I --> J["10 物化视图"]
D --> K["11 DuckDB 架构"]
K --> L["12 DuckDB Pipeline"]
L --> M["13 选型对照"]
M --> N["14 监控"]
N --> O["15 故障"]
O --> P["16 配置陷阱"]
三、目录(全 16 篇)
第一部分:存储格式(第 1–3 篇)
- 列存基础与 ClickHouse 架构 — 行存/列存三角、进程模型、MergeTree 家族。
- MergeTree
Part 文件格式 —
.bin/.mrk/Granule、clickhouse-local实验。 - 压缩与编码 — LZ4/ZSTD/Delta/Gorilla 与压缩比方法。
第二部分:读取与合并(第 4–7 篇)
- 向量化执行引擎 — Block、Processors;对照 PG 执行器。
- 查询读取路径
— Mark
Range、PREWHERE、
EXPLAIN indexes=1。 - Merge 与 Mutation — 后台 merge、Replacing/Collapsing、mutation 危害。
- 索引与跳数索引 — 稀疏主键、minmax/set/bloom。
第三部分:分布式与管道(第 8–10 篇)
- ReplicatedMergeTree — Keeper 协调、副本 lag。
- Distributed 引擎 — 分片键、GLOBAL IN/JOIN 代价。
- 物化视图与增量管道 — Kafka/S3Queue + MV、目标引擎选型。
第四部分:DuckDB 对照(第 11–13 篇)
- DuckDB 架构与嵌入式 OLAP — Row Group、进程内分析。
- DuckDB 向量化与 Pipeline — Morsel-driven 并行。
- ClickHouse vs DuckDB 选型 — 决策树,不排名。
第五部分:运维实战(第 14–16 篇)
- 监控与系统表
—
system.parts、system.merges、关键指标。 - 经典故障模式 — too many parts、merge 延迟、OOM。
- 配置陷阱与容量规划 — parts 阈值、merge 池、磁盘策略。
四、系列联动
| 系列 | 联动 |
|---|---|
| postgresql-kernel | 执行器、B-Tree、监控 |
| db/lsm-tree | Compaction vs Merge |
| storage | 压缩、块设备 |
| observability | 日志/trace 写入 ClickHouse |
五、边界
不替代 ClickHouse/DuckDB 官方文档;不写 Cloud 托管内部实现;benchmark 须自测或标注引用来源。
系列 index v2,2026-06-18 — 全 16 篇已发布
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【列存引擎内核】列存基础与 ClickHouse 架构
行存 vs 列存的带宽、压缩与向量化三角;ClickHouse Server 进程模型、线程池与 MergeTree 引擎家族地图;src/Storages 与 src/Processors 源码入口。对照 PG 行存与 LSM 写优化路径,版本锚定 ClickHouse 24.x LTS。
【列存引擎内核】MergeTree Part 文件格式
ClickHouse MergeTree Part 目录结构:columns.txt、checksums.txt、.bin、.mrk2、primary.idx 语义,Granule 与 Mark 的定位作用,Wide/Compact 布局与 MergeTreeDataPart 源码入口。版本锚定 24.x LTS。
【列存引擎内核】压缩与编码
ClickHouse 列压缩:LZ4、ZSTD、Delta、DoubleDelta、Gorilla 时序编码与列类型关系;CODEC 链顺序、LowCardinality 与 PG TOAST 对照。压缩比须本机实测,本文不编造倍数。
【列存引擎内核】向量化执行引擎
ClickHouse Block 列向量 batch、IProcessor Pipeline 与 filter/project/aggregate 向量实现;对照 PostgreSQL 火山模型 ExecProcNode。源码入口 src/Processors、src/Columns。24.x LTS。