2026-06-18 · database / storage
【列存引擎内核】ClickHouse 与 DuckDB 源码级拆解
主选 ClickHouse 拆解 MergeTree 存储格式、向量化执行与分布式协调;DuckDB 作为嵌入式 OLAP 对照。覆盖列存文件布局、merge 机制、跳数索引与生产故障模式,面向数据平台工程师与从 PG/MySQL 转 OLAP 的 DBA。
























本文是写作规划,不是可发布正文。主选 ClickHouse 作为拆解对象,DuckDB 作为嵌入式/OLAP 对照;不写泛泛的「列存概念」科普。
| 已有内容 | 引擎类型 | 视角 |
|---|---|---|
postgresql-kernel/ (26) |
行存 OLTP | B-Tree + MVCC + WAL |
db/lsm-tree/ (9) |
写优化 LSM | MemTable + SSTable + Compaction |
storage/ (79) |
通用原理 | 含列存概念但未落到具体实现 |
db-frontier/ (25) |
AI 原生 DB 前沿 | 向量/HTAP,非经典列存内核 |
结论:读者理解行存(PG)和写优化(LSM)后,缺 读优化列存 的完整源码级拆解。ClickHouse 是开源列存工程标杆;DuckDB 代表「嵌入式分析」路径——两者对照覆盖 OLAP 主战场。
| 维度 | ClickHouse | DuckDB |
|---|---|---|
| 源码 | C++,结构清晰,MergeTree 家族完整 | C++11,向量化执行教科书 |
| 文档 | 官方 MergeTree 文档详尽 | 官方 Internals 文档 |
| 生产案例 | 国内大量 OLAP/日志分析 | 数据科学、SQLite 替代分析 |
| 与 PG 关系 | 常作 PG 分析副本/外表 | pg_duckdb 扩展兴起 |
| 系列篇幅 | 主系列 15–18 篇 | 3–4 篇对照/专题 |
列存 = 存储布局 + 向量化执行 + 合并策略 + 分布式(可选)
不写 SQL 教程,写: - 为什么列存 scan 1 列比行存读整行快(含 CPU cache / SIMD) - MergeTree part 如何 merge、为什么 merge 是列存的心脏手术 - PRIMARY KEY 在 ClickHouse 里不是唯一约束——排序键语义 - 向量化 volcano vs 向量批处理(morsel-driven)
列存文件在磁盘上长什么样? → 第 1、2 章:Part、Column、Mark、Granule、压缩块。
一次 SELECT 如何从 part 读到向量批? → 第 3、4 章:Read path、Mark Range、PREWHERE、向量化执行。
MergeTree 的 merge 到底在合并什么? → 第 5、6 章:Merge 算法、TTL、Mutation vs Merge。
ClickHouse 的「索引」是什么? → 第 7 章:稀疏主键索引、跳数索引(minmax/set/bloom)、与 B-Tree 的本质差异。
分布式表如何工作? → 第 8、9 章:Local table、Distributed、ReplicatedMergeTree、ZooKeeper/ Keeper 协调。
列存生产环境会出什么事故? → 第 14–16 章:Parts 过多、merge 跟不上、mutation 阻塞、副本延迟、内存 OOM。
postgresql-kernel 或
storage 索引章节、基本 C++ 阅读能力src/Storages/、src/Databases/columns.txt、checksums.txt、.bin、.mrk、.idxclickhouse-local 建表 + 查看
data/ 目录src/Storages/MergeTree/MergeTreeDataPart*#12-executor)src/Processors/、src/Columns/max_threads、parts 级并行EXPLAIN indexes=1 输出解读MergeTreeDataMergerMutatorpostgresql-kernel/14-btree)对照表src/execution/、src/storage/system.parts、system.merges、system.replication_queueparts_to_throw_insert /
parts_to_delay_insertmerge_max_block_sizemax_bytes_to_merge_at_max_space_in_pool1 → 2 → 3 → 4 → 5
↓ ↓
6 ← 7 8 → 9
↓
10
11 → 12 → 13(DuckDB,可与 4–7 并行)
14 → 15 → 16
| 路径 | 篇目 | 适合 |
|---|---|---|
| OLAP 开发者 | 1→2→4→5→7 | 理解读写 |
| 平台/运维 | 1→6→8→14→15→16 | 集群稳定 |
| 嵌入式分析 | 11→12→13 | DuckDB |
| 从 PG 来 | 1→7→5 + PG 14 对照 | 索引语义差异 |
24.3)https://duckdb.org/docs/internals/环境 | ClickHouse 24.x single node +
可选 2-node replica |
工具 |
clickhouse-client、clickhouse-local、系统表
|
数据集 | hits 样本或
clickhouse-benchmark 默认 |
| 章 | 实验 |
|---|---|
| 2 | 列文件 hex 结构对照文档 |
| 3 | 编码压缩比表 |
| 5 | PREWHERE 行数对比 EXPLAIN |
| 6 | 触发 merge + 观察 system.merges |
| 8 | 副本 lag 人工制造 |
| 15 | too many parts 复现(测试环境) |
| 系列 | 联动 |
|---|---|
postgresql-kernel/ |
执行器、B-Tree、监控对照 |
db/lsm-tree/ |
Compaction vs Merge 对照 |
storage/ |
压缩、块设备 |
observability/ |
日志/trace 写入 ClickHouse 场景 |
duckdb/?MergeTree 以外引擎(如
S3Queue)专章?规划版本:v1,2026-06-18
目录建议:post/db/columnar-engine/
把当前热点继续串成多页阅读,而不是停在单篇消费。
2026-06-18 · database / storage
主选 ClickHouse 拆解 MergeTree 存储格式、向量化执行与分布式协调;DuckDB 作为嵌入式 OLAP 对照。覆盖列存文件布局、merge 机制、跳数索引与生产故障模式,面向数据平台工程师与从 PG/MySQL 转 OLAP 的 DBA。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。