惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
Recorded Future
Recorded Future
博客园 - 【当耐特】
博客园 - 聂微东
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
C
Check Point Blog
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
Last Week in AI
Last Week in AI
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
罗磊的独立博客
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
The Cloudflare Blog
博客园 - 司徒正美
D
Docker
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
J
Java Code Geeks
B
Blog
Martin Fowler
Martin Fowler
L
LangChain Blog
V
Visual Studio Blog
U
Unit 42
P
Proofpoint News Feed
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
F
Fortinet All Blogs
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
T
Tailwind CSS Blog
H
Help Net Security
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【列存引擎内核】DuckDB 向量化与 Morsel-Driven Pipeline
Liao Tonglang · 2026-06-18 · via 土法炼钢兴趣小组的算法知识备份

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 典型路径:

  1. 比较产生 SelectionVector
  2. 下游算子只处理选中行;
  3. 常配合 字典编码 列避免物化。

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.cpp
  • src/execution/operator/scan/physical_table_scan.cpp
  • src/execution/operator/join/physical_hash_join.cpp
  • src/execution/operator/aggregate/physical_hash_aggregate.cpp

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

超过 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 时:

  1. 读 segment footer statistics;
  2. max < predicate constant → skip entire segment;
  3. 否则 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_logtrace_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 架构

下一篇ClickHouse vs DuckDB 选型

参考资料

  1. DuckDB Documentation, Execution, Parallelism, 1.x
  2. DuckDB Source, src/execution/, src/parallel/
  3. Boncz et al., MonetDB/X100: Hyper-Pipelining Query Execution, CIDR 2005
  4. Leis et al., Morsel-Driven Parallelism, SIGMOD 2014
  5. ClickHouse Source, src/Processors/ — 对照

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-18 · database / architecture

【列存引擎内核】物化视图与增量管道

ClickHouse Materialized View 的触发语义、块级增量与目标表引擎选择;Kafka Engine + MV 典型架构;与 PostgreSQL 触发器/MV 的对照及常见坑。

2026-06-18 · database / architecture

【列存引擎内核】经典故障模式

Too many parts、merge 跟不上 insert、mutation 堆积、副本延迟与 lost replica、max_memory_usage OOM 的症状链、根因与缓解;附测试环境复现框架。