DuckDB 自称「SQLite for
analytics」:进程内、无服务器、列向量化
OLAP——与 ClickHouse
列存基础(第 01 篇) 的 Server + MergeTree
模型形成对照。Python/R/Julia 通过库直接
import duckdb,SQL
在宿主进程内编译执行;数据可在 .duckdb
文件、内存或外部 Parquet/CSV。
本文建立 DuckDB 1.x 架构心智模型:Catalog → Optimizer → Parallel Pipeline → Column Segment 存储。不排名「谁更强」——第 13 篇 谈选型;本篇锚定 嵌入式分析 路径。
版本锚定:DuckDB 1.x(官方 Internals
文档与 main 分支源码结构)。
一、部署模型:in-process vs server
| 维度 | ClickHouse Server | DuckDB |
|---|---|---|
| 进程 | 独立 daemon | 嵌入宿主(Python/JVM/CLI) |
| 网络协议 | TCP/HTTP/MySQL 协议 | 无(API / CLI) |
| 并发模型 | 多 client 连接 | 单进程内多线程 pipeline |
| 存储默认 | MergeTree Part 目录 | 单文件 DB + Row Group |
| 典型场景 | 集群 OLAP、日志仓 | 笔记本 EDA、ETL、PG 扩展 |
flowchart TB
subgraph ch [ClickHouse]
SRV[clickhouse-server]
MT[MergeTree Parts]
SRV --> MT
end
subgraph duck [DuckDB Embedded]
APP[Python / R / CLI]
ENG[DuckDB Engine]
DB[(database file)]
APP --> ENG --> DB
end
工程结论:需要 多租户远程 SQL 服务 → ClickHouse(或 Trino 等);需要 脚本内嵌分析、零运维 → DuckDB。
二、进程内架构分层
DuckDB 源码顶层(A
级:https://duckdb.org/docs/internals/overview):
| 层 | 目录(约) | 职责 |
|---|---|---|
| Parser / Binder | src/parser/,
src/planner/binder/ |
SQL → 逻辑计划 |
| Optimizer | src/optimizer/ |
谓词下推、JOIN 重排 |
| Execution | src/execution/ |
物理计划、Pipeline |
| Storage | src/storage/ |
Table、Row Group、Segment |
| Catalog | src/catalog/ |
元数据、类型 |
| Transaction | src/transaction/ |
MVCC 简化模型 |
查询路径:
flowchart LR
SQL[SQL] --> P[Parser]
P --> B[Binder]
B --> O[Optimizer]
O --> PP[Physical Plan]
PP --> PL[Pipelines]
PL --> RG[Row Groups / Segments]
与 ClickHouse
Parser → Analyzer → QueryPlan → Processors
同构,但 无 Distributed
远程子计划(联邦另说)。
三、Storage:Table → Row Group → Column Segment
DuckDB 持久化列存与 ClickHouse Part 不同:
| ClickHouse MergeTree | DuckDB |
|---|---|
Part 目录 + 每列
.bin/.mrk |
Row Group 内 Column Segment |
| 后台 merge 合成大 Part | Checkpoint 合并 + vacuum |
primary.idx 稀疏索引 |
Zone map / statistics |
3.1 Row Group
默认约 122880 行 一组(版本可能调整,以
STORAGE_ROW_GROUP_SIZE 或文档为准)。Row Group
是 并行与压缩 的单元——类似 ClickHouse Granule(第
02 篇) 的上层容器。
3.2 Column Segment
每列在每个 Row Group 内一段 Column Segment:
- 压缩列数据(Lightweight 压缩 + 通用 codec);
- Segment-level statistics(min/max、null count)用于 skip;
- 持久化于 DB 文件 block 页。
flowchart TB
T[Table]
T --> RG1[Row Group 0]
T --> RG2[Row Group 1]
RG1 --> C1[col_a segment]
RG1 --> C2[col_b segment]
RG2 --> C3[col_a segment]
RG2 --> C4[col_b segment]
3.3 Checkpoint
DuckDB 周期性 checkpoint
把内存表数据刷入文件、整理 WAL 式日志(实现细节见
src/storage/checkpoint/)。对比 ClickHouse
始终写 Part + 异步 merge——DuckDB 更偏
单文件 SQLite 生命周期。
3.4 外部文件:Parquet / CSV
SELECT count(*) FROM read_parquet('data/*.parquet');
CREATE TABLE t AS SELECT * FROM read_parquet('events.parquet');零拷贝式分析:不 import 也可查 Parquet——列存格式对齐 DuckDB 向量化读(见 第 12 篇 Pipeline)。
四、Catalog 与类型系统
DuckDB Catalog 管理 schema、表、宏、序列。嵌入式场景常:
import duckdb
con = duckdb.connect('analytics.duckdb')
con.execute("CREATE TABLE hits AS SELECT * FROM read_parquet('hits/*.parquet')")| 特性 | 说明 |
|---|---|
| 嵌套类型 | STRUCT, LIST, MAP
—— 分析 JSON 友好 |
ENUM |
低基数 string |
| 扩展 | LOAD httpfs; LOAD icu;
社区扩展 |
类型丰富度利于 数据科学;ClickHouse 用
Nested、JSON
类型(版本差异)应对类似需求——语法不互通。
五、事务与并发
DuckDB 支持 ACID 事务(单写者多读者模型演进中,1.x 文档强调并发读 + 写串行化程度因版本改进)。与 ClickHouse 无经典 OLTP 事务 对比鲜明。
| 操作 | DuckDB | ClickHouse MergeTree |
|---|---|---|
| BEGIN/COMMIT | 支持 | 不支持跨语句事务 |
| UPDATE/DELETE | 支持(重写 Row Group) | Mutation 异步 |
| 并发写 | 受限 | 高 ingest |
边界:DuckDB 不是高并发 OLTP 替代品;ClickHouse 不是银行核心账务库。
六、扩展生态:httpfs、postgres_scanner、pg_duckdb
6.1 httpfs / S3
INSTALL httpfs;
LOAD httpfs;
SET s3_region='us-east-1';
SELECT * FROM read_parquet('s3://bucket/data/*.parquet');云数据湖 探查 场景 DuckDB 极常出现——无需起集群。
6.2 postgres_scanner
INSTALL postgres;
LOAD postgres;
ATTACH 'dbname=postgres user=...' AS pg (TYPE POSTGRES);
SELECT * FROM pg.public.orders JOIN local_summary USING (id);联邦查询在 DuckDB 进程内 完成——对比
ClickHouse PostgreSQL table engine 或
jdbc 桥。
6.3 pg_duckdb
PostgreSQL 扩展 pg_duckdb(社区/官方协作演进)把 DuckDB 嵌入 PG 进程执行分析查询——「PG 权限 + DuckDB 向量执行」。与 ClickHouse 作 PG 副本 是不同架构:
- pg_duckdb:单 PG 实例内加速;
- CH 副本:独立 OLAP 集群,CDC/批量同步。
七、内存模型
DuckDB 默认 aggressive 使用可用内存做 hash join / aggregate spill 前缓冲。Settings 如:
memory_limitthreadstemp_directory( spill )
嵌入式 Python 中常:
con.execute("SET memory_limit='4GB'")
con.execute("SET threads=4")无 fabricated 性能数字——笔记本与服务器差异极大。
八、与 ClickHouse 存储对照表
| 机制 | ClickHouse | DuckDB |
|---|---|---|
| 最小 IO 单元 | Granule + Mark | Row Group + Segment |
| 合并 | MergeTree merge | Checkpoint |
| 主键 | ORDER BY 排序键 | 无强制 PK;索引 via ART 等扩展 |
| 跳数索引 | minmax/set/bloom | Segment stats + zone maps |
| 分布式 | Distributed + Keeper | 无内置;靠外部调度 |
| 压缩 | CODEC per column | Automatic + 列压缩 |
读路径对照 查询读取路径(第 05 篇) 与 第 12 篇。
九、适用场景边界
9.1 DuckDB 主场
- 单机 TB 级以下交互分析;
- Notebook / CI 内 SQL;
- Parquet/CSV 即席;
- 边缘设备本地聚合;
- PG 侧 carves out 分析(pg_duckdb)。
9.2 不应 sole 依赖 DuckDB
- 持续高 QPS 远程 SQL 服务;
- 多团队共享 PB 级集群 + 细粒度 RBAC;
- 需要 ReplicatedMergeTree 级 副本 HA(自建);
- 超大规模 ingest 与 parts 治理(第 15 篇) 类运维——ClickHouse 工具链更成熟。
十、CLI 与文件布局
duckdb analytics.duckdb -c "SELECT version()"数据库文件内含:
- 存储 block;
- Catalog 元数据;
- 可选 WAL(版本相关)。
不像 ClickHouse
data/db/table/part/ 可直接 ls
教学——教学 Part 格式用 clickhouse-local(第
02 篇);DuckDB 用 PRAGMA database_size 等
introspec。
PRAGMA database_size;
SELECT table_name, estimated_size FROM duckdb_tables();输出须本地执行后解读。
十一、源码阅读路线
src/storage/data_table.cpp— Table 入口src/storage/table/row_group.cpp— Row Groupsrc/storage/table/column_segment.cpp— Segment 压缩与 scansrc/execution/physical_operator.cpp— 算子基类src/parallel/executor.cpp— 并行调度(衔接第 12 篇)
官方 Internals PDF/网页与源码注释一致处为 A 级证据。
十二、实验框架(须本地执行)
12.1 Row Group 观察
CREATE TABLE rg_demo AS SELECT range AS id, id % 7 AS g FROM range(500000);
PRAGMA show_tables;
-- 查 storage 相关 pragma(版本以文档为准)12.2 Parquet 联邦
COPY (SELECT * FROM range(1000000)) TO '/tmp/rg_test.parquet' (FORMAT PARQUET);
SELECT sum(id) FROM read_parquet('/tmp/rg_test.parquet');12.3 与 ClickHouse 导出互操作
# ClickHouse 侧(若环境有)
clickhouse-client -q "SELECT * FROM t FORMAT Parquet" > t.parquet
duckdb -c "SELECT count(*) FROM 't.parquet'"不声称转换性能——仅验证格式互通。
十三、小结
DuckDB = 嵌入宿主进程的列向量化分析引擎;Storage 以 Row Group / Column Segment 为核心,checkpoint 维护文件健康。理解其与 ClickHouse Server + MergeTree + Distributed 的分工,是 OLAP 技术选型的第一步。
附录 A、Column Segment 生命周期
- Insert 积累内存 buffer;2. Row Group 满则 compress 写 segment;3. Checkpoint 将 catalog 与 segment pointer 持久化;4. Vacuum/optimize 合并小 segment(视版本 API)。读路径:statistics → 可能 skip → decompress → vector。
附录 B、压缩栈
DuckDB 列 segment 常 轻量编码(RLE/FOR 等)+ 通用
codec。与 CH
第 03 篇 显式 CODEC() 不同,DuckDB
默认自动选择——DDL 控制少,Parquet 外链保留源
compression。
附录 C、嵌套类型示例
CREATE TABLE events (id BIGINT, props STRUCT(url VARCHAR, status INTEGER));
SELECT props.url FROM events WHERE props.status >= 500;STRUCT/LIST 利于 semi-structured;ClickHouse 用
JSON/Tuple 类型,SQL 不互通。
附录 D、扩展列表(1.x 常见)
| 扩展 | 用途 |
|---|---|
| httpfs / aws | S3/HTTP Parquet |
| postgres | PG attach |
| icu | 排序/.locale |
| json | JSON 函数增强 |
| parquet | Parquet 读写 |
INSTALL ext; LOAD ext; —
离线环境需预装。
附录 E、WAL 与 crash recovery
进程 crash 后 reopen .duckdb replay
WAL(实现见 src/storage/wal/)。与 CH 始终 part
可见不同——单文件 DB 需 备份时 checkpoint
减少恢复时间。
附录 F、pg_duckdb 边界
查询通过 PG planner hook 路由 DuckDB 执行 只读分析 子集;写入仍 PG heap。不适合把 PG 当分布式存储再期望 DuckDB 跨节点。与 CH 独立副本 对比:pg_duckdb 少运维、争用 PG RAM。
附录 G、内存与文件锁
多进程同时写同一 .duckdb
文件会失败——嵌入模型
单写者。只读多进程只读模式视版本文档。ClickHouse
多 client 并发写 MergeTree 是常态。
附录 H、Row Group 大小调优
过大 Row Group 降低并行度;过小则 metadata
与压缩效率差。官方默认对多数 OLAP 平衡——改
STORAGE pragma 前须本地
benchmark,本文不给最优值。
附录 I、与 SQLite 对比
同 embed 哲学;DuckDB 列存+向量化面向 OLAP,SQLite 行存
B-Tree 面向 OLTP。SQLite 分析扩展 .load
模块不等价 DuckDB 执行层。
附录 J、术语
| 术语 | 含义 |
|---|---|
| Row Group | 存储并行/压缩单元 |
| Column Segment | 列在 RG 内一段 |
| Checkpoint | 持久化快照点 |
| Attach | 挂载外部 DB/Parquet |
附录 K、Database 文件格式(概念)
.duckdb 为 block 页文件:meta block 指向
catalog、row group index、free list。不像 MergeTree 一 part
一目录——备份=复制文件
时需无并发写。CHECKPOINT 命令强制刷盘。
附录 L、Temp 与 in-memory
:memory: 数据库全 RAM——适合 ephemeral ETL。
spill 仍可能用 temp_directory 即使 DB
in-memory。
附录 M、Secret 与配置
CREATE SECRET(版本相关)存 S3
密钥——勿硬编码 SQL。ClickHouse 用 config.xml +
env substitution。
附录 N、Unicode 与 collation
ICU 扩展提供 locale 排序——分析中文排序规则时加载 icu。ClickHouse collation 支持因类型而异。
附录 O、Import/Export
EXPORT DATABASE 'd' (FORMAT PARQUET) TO 'dir';
IMPORT DATABASE 'd2' FROM 'dir';跨版本 import 需版本兼容矩阵查 release notes。
附录 P、Python API 模式
import duckdb
con = duckdb.connect()
con.execute("SET threads TO 4")
rel = con.sql("SELECT * FROM read_parquet('*.parquet')")
rel.df() # pandasArrow 路径:duckdb.query(arrow_table)
避免拷贝。
附录 Q、R 与 Julia
duckdb::dbConnect / DBI;Julia
DuckDB.jl——嵌入哲学相同:无 TCP server。
附录 R、Read-only 分析副本
DuckDB 只读 attach 另一 .duckdb
文件(READ_ONLY 模式查文档)——类似 CH replica
但无自动同步。
附录 · 深度补充(系列交叉索引)
深度 1
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 2
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 3
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 4
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 5
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 6
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 7
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 8
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 9
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 10
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 11
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 12
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 13
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 14
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 15
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 16
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 17
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 18
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 19
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 20
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 21
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 22
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 23
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 24
第 11 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
附录 · 工程深化索引
深化 1:Row Group 与 Granule 对照
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Row Group 与 Granule 对照 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 2:Column Segment 压缩
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Column Segment 压缩 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 3:pg_duckdb 联邦边界
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | pg_duckdb 联邦边界 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 4:嵌入式无 TCP 安全面
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 嵌入式无 TCP 安全面 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 5:Arrow 零拷贝路径
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Arrow 零拷贝路径 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 6:SQLite 兼容层局限
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | SQLite 兼容层局限 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 7:扩展加载机制
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 扩展加载机制 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 8:单文件 .duckdb 备份
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 单文件 .duckdb 备份 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 9:内存上限 threads 调优
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 内存上限 threads 调优 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 10:Parquet 直读 vs 导入
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Parquet 直读 vs 导入 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 11:WASM 客户端场景
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | WASM 客户端场景 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 12:R/Julia 绑定
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | R/Julia 绑定 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 13:只读 attach 模式
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 只读 attach 模式 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 14:checkpoint 语义
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | checkpoint 语义 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 15:统计信息 auto
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 统计信息 auto 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 16:优化器 join order
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 优化器 join order 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 17:窗口函数向量化
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 窗口函数向量化 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 18:UDF 扩展边界
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | UDF 扩展边界 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 19:多进程写锁
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 多进程写锁 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 20:DuckDB 1.x 版本锚定
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | DuckDB 1.x 版本锚定 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 21:与 CH MergeTree 差异
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 与 CH MergeTree 差异 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 22:嵌入式 OLAP 选型
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 嵌入式 OLAP 选型 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 23:MotherDuck 托管边界
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | MotherDuck 托管边界 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 24:本地分析笔记本场景
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 本地分析笔记本场景 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 25:storage 层源码入口
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | storage 层源码入口 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 26:Row Group 与 Granule 对照
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Row Group 与 Granule 对照 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 27:Column Segment 压缩
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Column Segment 压缩 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 28:pg_duckdb 联邦边界
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | pg_duckdb 联邦边界 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 29:嵌入式无 TCP 安全面
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 嵌入式无 TCP 安全面 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 30:Arrow 零拷贝路径
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Arrow 零拷贝路径 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 31:SQLite 兼容层局限
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | SQLite 兼容层局限 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
深化 32:扩展加载机制
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 扩展加载机制 在 ClickHouse 24.x 中的默认行为 | 第 05 篇 |
| 运维 | staging 用 system.parts /
query_log 建 24h 基线 |
第 14 篇 |
| 故障 | 与 parts/merge 相关的典型信号 | 第 15 篇 |
| 配置 | 相关 setting 变更须可回滚 | 第 16 篇 |
flowchart LR
Q[查询/写入] --> P[parts 状态]
P --> M[merge 后台]
M --> MON[system.merges]
MON --> CFG[配置调优]
上一篇:物化视图
参考资料
- DuckDB Documentation, Internals, duckdb.org/docs/internals, 1.x
- DuckDB Source,
src/storage/,src/execution/ - Raasveldt & Mühleisen, DuckDB: an Embeddable Analytical Database, SIGMOD 2019 demo
- ClickHouse Documentation — 部署对照
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【列存引擎内核】ClickHouse 与 DuckDB 选型决策
从部署形态、规模、并发、联邦与运维成本五维对比 ClickHouse 与 DuckDB;给出决策树与组合架构,不排名不测虚构 benchmark。
【列存引擎内核】DuckDB 向量化与 Morsel-Driven Pipeline
DuckDB 向量批执行、morsel-driven 并行、Pipeline 调度与 spill;源码 execution/parallel 路径;对照 ClickHouse Processors 与 PG volcano 模型。
【列存引擎内核】物化视图与增量管道
ClickHouse Materialized View 的触发语义、块级增量与目标表引擎选择;Kafka Engine + MV 典型架构;与 PostgreSQL 触发器/MV 的对照及常见坑。
【列存引擎内核】经典故障模式
Too many parts、merge 跟不上 insert、mutation 堆积、副本延迟与 lost replica、max_memory_usage OOM 的症状链、根因与缓解;附测试环境复现框架。