MonetDB/X100
确立的 向量批执行 被 DuckDB 与 ClickHouse
共同继承;DuckDB 在并行层采用
morsel-driven(HyPer 论文传统):Row Group
切成 morsel,线程池动态抢任务,而非静态
partition。本文从物理算子讲到
src/parallel/executor.cpp,并对照 ClickHouse
向量化(第 04 篇) 与 PostgreSQL
执行器 的 volcano 逐行模型。
版本锚定:DuckDB 1.x。
一、Volcano vs Vector vs Morsel
| 模型 | 数据单位 | 并行 | 代表 |
|---|---|---|---|
| Volcano | 1 row | 难 | PG 传统 plan |
| Vector | batch(如 1024 行) | 算子内 SIMD | MonetDB/X100 |
| Morsel-driven | batch + 动态 work queue | 核间负载均衡 | HyPer, DuckDB |
PostgreSQL 11+ 有部分 vectorization,但 OLTP 主路径仍是 tuple-at-a-time;DuckDB 纯分析 全路径向量 + morsel。
flowchart TB
subgraph vol [Volcano PG]
N1[Next tuple loop]
end
subgraph vec [Vector CH/DuckDB]
B[Column batch]
SIMD[SIMD filter/aggr]
B --> SIMD
end
subgraph mor [Morsel DuckDB]
Q[Task queue]
W1[Worker]
W2[Worker]
Q --> W1
Q --> W2
end
二、Column Vector 与 Selection Vector
DuckDB DataChunk(概念名,源码见
src/common/types/data_chunk.cpp)持有:
- 多列
Vector; - 行数
count; - 可选 Selection Vector(filter 后活跃行索引,避免物理删除)。
Filter 典型路径:
- 比较产生
SelectionVector; - 下游算子只处理选中行;
- 常配合 字典编码 列避免物化。
ClickHouse ColumnUInt8 filter 类似,实现在
src/Columns/——第
04 篇 已述 Block 结构。
三、Physical Operator 与 Pipeline
物理计划树分解为 Pipeline:线性算子链 + 一个 Source + 一个 Sink。
flowchart LR
SRC[Table Scan Source]
F[Filter]
P[Projection]
H[Hash Join Probe]
A[Hash Aggregate]
SNK[Result Collector Sink]
SRC --> F --> P --> H --> A --> SNK
- Pipeline breaker:Hash Join Build、Hash Aggregate 等会 Barrier——先完成 build 再 probe。
- Meta-Pipeline:复杂 JOIN 树多 pipeline
由
Executor调度顺序。
源码入口:
src/execution/physical_operator.cppsrc/execution/operator/scan/physical_table_scan.cppsrc/execution/operator/join/physical_hash_join.cppsrc/execution/operator/aggregate/physical_hash_aggregate.cpp
四、Morsel-Driven 并行
4.1 划分
Table Scan 按 Row Group → morsel(默认与 Row Group 对齐或可再切)。每个 morsel 是一个 ParallelTask。
4.2 调度
TaskScheduler 维护 worker 线程;任务完成
push 新 morsel。负载均衡:慢 morsel(高
selectivity 后仍大)不阻塞快线程。
对比 ClickHouse:
- CH:
max_threads+ parts 级并行 + MergeTree range 读; - DuckDB:单表 scan 也 morsel 并行,无 shard。
4.3 threads
setting
SET threads = 8;超过 CPU 核数可能因 contention 变慢——须本地 benchmark,本文不给倍数。
五、Hash Join 实现要点
DuckDB 默认 hash join(无 index nested loop 对事实表大 scan 不友好)。
Build 侧:
- 向量化 insert hash table;
- 字符串用 salted hash;
- 大 build 可 external hash join spill 到
temp_directory。
Probe 侧:
- morsel 并行 probe;
- semi/anti join 优化消除不必要列。
ClickHouse ConcurrentHashJoin / grace hash
在 src/Processors/——分布式时还有
GLOBAL 广播(第
09 篇)。
六、Aggregation
6.1 单层聚合
PhysicalHashAggregate:hash table 键 = GROUP
BY 列,值 = aggregate state。
6.2 两阶段 / 分区
高 cardinal GROUP BY:
- 先 partition 再 partial aggregate;
- spill 类似 join。
ClickHouse group_by_two_level_threshold
同族思路——配置(第
16 篇)。
6.3 DISTINCT
Often GROUP BY + COUNT 或专用
PhysicalDistinct——优化器 rewrite。
七、Optimizer 与 Pipeline 的衔接
src/optimizer/ 规则影响物理 plan:
- Predicate pushdown 到 scan(Parquet row group stats);
- Join order 动态规划 / 启发式;
- Common subexpression elimination;
- Top-N 下推(LIMIT + ORDER BY)。
EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...;EXPLAIN ANALYZE 输出 实际
timing——仅本地有效,不可跨文引用具体毫秒。
八、Table Scan 与 Segment Skip
读 ColumnSegment 时:
- 读 segment footer statistics;
- 若
max < predicate constant→ skip entire segment; - 否则 decompress + vector filter。
与 ClickHouse Mark Range + 跳数索引(第 07 篇) 同族 zonemap pruning。
Parquet 扫描复用 row group
metadata——read_parquet 不经过 DuckDB
storage 仍享 skip。
九、Spill 与内存
Settings:
| Setting | 作用 |
|---|---|
memory_limit |
进程软上限 |
max_temp_directory_size |
spill 上限 |
preserve_insertion_order |
是否保序(影响并行) |
OOM 时 DuckDB 尝试 spill;仍失败则报错——嵌入式 Python 需 catch。
ClickHouse OOM 见 max_memory_usage 与 经典故障(第
15 篇)。
十、并行 COPY 与 INSERT
COPY large_table FROM 'big.csv' (HEADER, DELIMITER ',');Parser + 向量化 insert 可并行读文件——瓶颈常在磁盘或 CSV parse。
对比 ClickHouse INSERT FORMAT CSV + ingest
背压——DuckDB 单机 无
parts_to_throw_insert,但超大事务 checkpoint
压力存在。
十一、UDF 与向量边界
用户标量 UDF 若未向量化,可能 逐行回调 Python——destroy 性能。推荐:
- DuckDB 原生 SQL / 宏;
- Arrow 零拷贝接口;
- 扩展 C++ UDF。
ClickHouse 同理:Python UDF 慢于原生
executable 或 SQL。
十二、与 ClickHouse Processors 对照
| 概念 | DuckDB | ClickHouse |
|---|---|---|
| 批 | DataChunk | Block |
| 图 | Pipeline + MetaPipeline | Processor DAG |
| 并行 | Morsel task queue | max_threads, parts |
| 远程 | 无 | RemoteQueryExecutor |
| EXPLAIN | EXPLAIN ANALYZE | EXPLAIN PLAN, query_log |
读 CH 源码
src/Processors/Executors/ExecutingGraph.cpp 与
DuckDB src/parallel/executor.cpp 可感受
调度哲学差异。
十三、PostgreSQL 执行器对照
PG
执行器(第 12 篇 PG) ExecProcNode 逐 plan
node 递归;DuckDB 编译为 扁平 pipeline + 向量
primitive。PG 向 OLAP 的 columnar
store(cstore_fdw 等)不在 PG 核内——pg_duckdb
是旁路加速。
十四、Profiling
PRAGMA enable_profiling;
SELECT ...;
PRAGMA profiling_output = 'query.json';Chrome trace 风格分析 morsel 并行度——工具随版本演进,以文档为准。
ClickHouse 用
query_log、trace_log(监控(第 14
篇))。
十五、实验框架(须本地执行)
15.1 并行度对比
SET threads=1;
SELECT sum(v) FROM big WHERE g > 0;
SET threads=8;
SELECT sum(v) FROM big WHERE g > 0;记录 EXPLAIN ANALYZE 中 total
time——仅本地。
15.2 Join spill
SET memory_limit='128MB';
SELECT count(*) FROM big a JOIN big b ON a.id = b.id;观察是否 spill 或失败。
十六、小结
DuckDB 执行层 = 向量批 + morsel-driven 任务窃取;优化器把 skip 下推到 Segment/Parquet。理解 Pipeline breaker 与 spill,就理解嵌入式 OLAP 在 单机核数 上的扩展上限。
附录 A、物理算子目录(源码)
| 算子 | 路径方向 |
|---|---|
| Table Scan | operator/scan/physical_table_scan.cpp |
| Filter | operator/filter/physical_filter.cpp |
| Hash Join | operator/join/physical_hash_join.cpp |
| Cross Product | operator/join/physical_cross_product.cpp |
| Hash Aggregate | operator/aggregate/physical_hash_aggregate.cpp |
| Window | operator/aggregate/physical_window.cpp |
| Order By | operator/order/physical_order.cpp |
| Limit | operator/limit/physical_limit.cpp |
| Insert | operator/persistent/physical_insert.cpp |
附录 B、Pipeline Breaker 列表
Hash Join Build、Hash Aggregate、Sort、部分 Window 会 barrier——先完成 build 再 probe/输出。理解 breaker 数量解释 为何某些查询并行度低。
附录 C、Grace Hash Join
Build 侧大于 memory 时分区 spill 到
temp_directory,逐分区 join。ClickHouse 类似
grace hash in processors。调小 memory_limit
可强制 spill 测试(测试库)。
附录 D、Optimizer 规则(代表性)
Filter pushdown、Join reorder、Common
subexpression、Top-N pushdown、Duplicate grouping
removal。EXPLAIN 输出 logical → physical
变化。
附录 E、TaskScheduler 与 work stealing
Worker 线程从队列取 morsel;慢 scan 不会阻塞快 scan 完成后的 worker 抢新 morsel——对比静态 hash partition 的 straggler 问题。
附录 F、SIMD
Filter/compare 在 vector_operations/ 使用
SIMD intrinsics——与 ClickHouse Columns SIMD
同类,具体 ISA 取决于编译 flag。
附录 G、Arrow 互操作
DuckDB 可 zero-copy 消费 Arrow _record batch——Python
duckdb.query(arrow_table)
避免序列化。ClickHouse 用 Arrow format INSERT/SELECT
但跨进程。
附录 H、Preservation insertion order
preserve_insertion_order=false 允许更激进
reorder——ETL 无 ORDER BY
要求时可试,须验证结果确定性需求。
附录 I、Profiling 字段
EXPLAIN ANALYZE 给出 operator
timing、cardinality estimate vs actual——estimate 偏差大时应
ANALYZE 或增统计信息(视版本)。
附录 J、对照 ClickHouse Processors
| DuckDB | ClickHouse |
|---|---|
| DataChunk | Block |
| MetaPipeline | QueryPipeline |
| PhysicalOperator | IProcessor |
| Executor | PipelineExecutor |
读 CH ExecutingGraph.cpp 与 DuckDB
executor.cpp 对照加深理解。
附录 K、Union / Except pipeline
Set 操作可能 materialize
一侧——breaker。EXPLAIN 看是否
PhysicalUnion。
附录 L、CTE 与物化
大 WITH 可能被 inline 或
materialize——MATERIALIZED hint 语法查版本。错误
materialize 增加内存。
附录 M、Window 函数执行
Window 常 sort + partition
pipeline——ROWS BETWEEN 需 buffer 帧。高
parallel window 受限。
附录 N、Pivot / unpivot
PIVOT SQL 语法糖重写 aggregate+join——计划仍
hash aggregate 为主。
附录 O、Sample
USING SAMPLE 表采样——快速近似,不保证跨 run
相同 seed 除非固定。
附录 P、Copy 并行解析
CSV parallel=true 多线程读文件
split——需行边界正确。Parquet copy 列并行。
附录 Q、Index ART(可选)
DuckDB ART index 加速点查——OLAP 全 scan 仍主路径。ClickHouse 稀疏索引不同机制。
附录 R、Subquery decorrelation
相关子查询 rewrite 为 join——优化失败则 correlated loop 慢。改写为 explicit join 常稳。
附录 S、Prepared statement
参数化重复查询 cache plan——嵌入式应用推荐。
附录 T、Error 与 OOM 消息
Out of Memory Error: could not allocate block of size ...
— 降 threads、增 limit 或 spill path。
附录 · 深度补充(系列交叉索引)
深度 1
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 2
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 3
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 4
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 5
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 6
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 7
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 8
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 9
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 10
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 11
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 12
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 13
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 14
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 15
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 16
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 17
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 18
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 19
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 20
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 21
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 22
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 23
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
深度 24
第 12 章与系列其它篇章的交叉:读路径见 第 05
篇;merge 见 第 06
篇;索引见 第 07
篇;副本见 第
08 篇;Distributed 见 第
09 篇;监控见 第 14
篇;故障见 第 15
篇;配置见 第 16
篇。 实施任何 setting 变更前,在 staging 用
system.parts / query_log 建立 24h
基线,变更后再对比——避免无证据调参。
附录 · 工程深化索引
深化 1:Morsel 大小与 cache
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Morsel 大小与 cache 在 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:Pipeline 打断与 reschedule
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Pipeline 打断与 reschedule 在 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:并行 worker 窃取
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 并行 worker 窃取 在 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:Hash join 内存 spill
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Hash join 内存 spill 在 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:Aggregate hash table
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Aggregate hash table 在 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:Filter 向量化
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Filter 向量化 在 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:Expression 求值
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Expression 求值 在 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:Physical plan 缓存
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Physical plan 缓存 在 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:Prepared statement
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Prepared statement 在 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:EXPLAIN ANALYZE
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | EXPLAIN ANALYZE 在 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:Profiling 输出
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Profiling 输出 在 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:SIMD 实现入口
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | SIMD 实现入口 在 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:Vector 类型系统
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Vector 类型系统 在 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:Chunk 生命周期
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Chunk 生命周期 在 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:Operator 接口
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Operator 接口 在 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:Pipeline executor
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Pipeline executor 在 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:Task scheduler
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Task scheduler 在 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:NUMA 无关设计
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | NUMA 无关设计 在 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:单线程 fallback
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 单线程 fallback 在 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:与 CH Processors 对照
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 与 CH Processors 对照 在 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:向量化 volcano 差异
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 向量化 volcano 差异 在 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:批大小 2048 默认
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 批大小 2048 默认 在 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:并行度 SET threads
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 并行度 SET 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[配置调优]
深化 24:I/O 预取
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | I/O 预取 在 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:外部 sort merge
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 外部 sort merge 在 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:Morsel 大小与 cache
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Morsel 大小与 cache 在 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:Pipeline 打断与 reschedule
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Pipeline 打断与 reschedule 在 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:并行 worker 窃取
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | 并行 worker 窃取 在 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:Hash join 内存 spill
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Hash join 内存 spill 在 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:Aggregate hash table
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Aggregate hash table 在 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:Filter 向量化
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Filter 向量化 在 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:Expression 求值
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Expression 求值 在 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[配置调优]
深化 33:Physical plan 缓存
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Physical plan 缓存 在 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[配置调优]
深化 34:Prepared statement
| 检查项 | 说明 | 关联篇章 |
|---|---|---|
| 机制 | Prepared statement 在 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 架构
参考资料
- DuckDB Documentation, Execution, Parallelism, 1.x
- DuckDB Source,
src/execution/,src/parallel/ - Boncz et al., MonetDB/X100: Hyper-Pipelining Query Execution, CIDR 2005
- Leis et al., Morsel-Driven Parallelism, SIGMOD 2014
- ClickHouse Source,
src/Processors/— 对照
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【列存引擎内核】DuckDB 架构与嵌入式 OLAP
DuckDB 进程内嵌入式模型、Storage 的 Row Group 与 Column Segment、Catalog 与 checkpoint;与 ClickHouse Server 部署差异及 pg_duckdb 联邦场景边界。
【列存引擎内核】ClickHouse 与 DuckDB 选型决策
从部署形态、规模、并发、联邦与运维成本五维对比 ClickHouse 与 DuckDB;给出决策树与组合架构,不排名不测虚构 benchmark。
【列存引擎内核】物化视图与增量管道
ClickHouse Materialized View 的触发语义、块级增量与目标表引擎选择;Kafka Engine + MV 典型架构;与 PostgreSQL 触发器/MV 的对照及常见坑。
【列存引擎内核】经典故障模式
Too many parts、merge 跟不上 insert、mutation 堆积、副本延迟与 lost replica、max_memory_usage OOM 的症状链、根因与缓解;附测试环境复现框架。