database 分类归档

共 238 篇文章 · 返回首页

【向量检索引擎】混合检索与标量过滤:表达式、bitset 与选择度打穿归并

按 Milvus 2.6.x Bitset、Filter Templating 文档拆解表达式如何变成 bitset 再喂给 Knowhere;用最小故事、bitset 取反细节与选择度打穿 Top-k 归并的示意图,说明为何过滤会改变延迟而不只是改变结果数量;对读 db-frontier/09 的 ACORN、Filtered-DiskANN 争论。

【向量检索引擎】一致性模型:四级 GuaranteeTs 与 PACELC 的延迟账

按官方 Consistency Level 与 Timestamp 文档拆解 Strong/Bounded/Session/Eventually 如何映射到 GuaranteeTs,用最小故事、四级时间轴与 Strong 等待时序图说明「一致性」在 Milvus 里首先是一笔延迟账;对照 Abadi PACELC 定理与 Bailis PBS,说明 Bounded 是定性旋钮而非概率保证。

【向量检索引擎】Delete · Upsert · TTL:软删生命周期与覆盖写的两条路径

按 2.6.x Delete/Upsert/TTL 文档拆解软删 bitset 从逻辑不可见到 compaction 物理回收的完整生命周期,用官方 override/merge 内部步骤的时序图区分两种 upsert,并与 FreshDiskANN 的图索引删除模型对照,说明 Milvus 用「整段重建」而非「增量合并」处理删除。

【向量检索引擎】副本、负载与故障恢复:读缓存式副本与 WAL 单所有者

按官方 In-Memory Replica 与 Streaming Service 文档拆解副本组、shard leader、Proxy 缓存 failover 与 WAL Wait for Ready;用多副本拓扑图与迁移时序图说明 Milvus 的读副本更接近只读缓存池而非共识复制,并与 Chain Replication、PacificA 对照。

【向量检索引擎】生产排障:召回、延迟、堆积、OOM

用症状到机制的决策树覆盖召回/延迟/堆积/OOM 四类故障,按可见性、段状态、过滤选择度、离线队列、对象存储与副本拓扑逐层定位;用一个跨软删广播与副本改派的最小故事说明为什么同一查询会得到不稳定结果,不含未跑的集群数字。

【流式数据处理】事件时间、处理时间与 Watermark

拆解 event time、processing time、ingestion time 三种时间语义,给出 watermark 的形式化含义与 bounded-out-of-orderness 等生成策略,并说明侧输出、allowed lateness 如何处理迟到数据;附 event-time 与 processing-time 窗口对比的可复现实验步骤。

【流式数据处理】窗口:滚动、滑动与会话

从 WindowAssigner 三类(Tumbling、Sliding、Session)出发,讲清窗口 state 如何随 key 与窗口实例增长,Trigger 与 Evictor 如何改变 firing 与清理节奏,GlobalWindow 自定义 Trigger 的边界,并与批式 GROUP BY 时间分桶对照;附三种窗口 state 观测的可复现步骤。

【流式数据处理】键控状态与 State TTL

系统拆解 ValueState、ListState、MapState、ReducingState、AggregatingState 的语义与适用场景,对比 HashMapStateBackend 与 EmbeddedRocksDBStateBackend 选型,讲清 State TTL 的更新/可见性/清理策略,并给出窗口 state 与 RocksDB 磁盘占用的估算方法。

【流式数据处理】RocksDB State Backend 内核路径

拆解 Flink EmbeddedRocksDBStateBackend 的物理布局:每个 subtask 独立 RocksDB 实例、ColumnFamily 与 KeyGroup 前缀映射、写路径 memtable→WAL→flush→compaction 与 lsm-tree 系列对照、读路径 block cache 与读放大、增量 checkpoint 与全量 snapshot 的 IO 差异。

【流式数据处理】交付语义:从 at-most-once 到 exactly-once

用 Source、引擎、Sink 三层模型拆解 at-most-once、at-least-once、exactly-once 的组合规则与最弱环决定律;对照 Flink checkpoint 模式、Kafka 事务与幂等 producer、重复消费/重复写入的三类修复手段,为两阶段提交 sink 铺垫。

【流式数据处理】两阶段提交与端到端 Exactly-Once

拆解 Flink GenericTwoPhaseCommitSink 协议:preCommit 进 checkpoint、commit 挂 notifyCheckpointComplete;对照 Kafka 事务 sink、JDBC 与 Iceberg 2PC 落点,以及 commit 前/后崩溃与重复 commit 的幂等边界——与 lakehouse/11 CAS、lakehouse/19 入湖侧对读,不重复表格式全文。

【流式数据处理】背压、故障模式与引擎对照

收束流式数据处理系列:Flink credit-based 背压如何沿算子链传播、Web UI 指标怎么读;数据倾斜、checkpoint 超时连锁、Kafka rebalance 风暴、RocksDB OOM、savepoint 不兼容五类生产故障的诊断与止血;Flink / Kafka Streams / Spark Structured Streaming / RisingWave 在状态模型、交付语义、运维与入湖成熟度上的对照表与选型决策树,不做排名。

【RocksDB 内核机制】LevelDB · WAL · Compaction · Column Family · 生产嵌入

补全存储引擎三角最后一角:从 LevelDB 基线与 RocksDB 架构演进,到 WAL/MemTable/SST 写路径、Get/Iterator 读路径、Leveled/Universal compaction 与 write stall,再到 Column Family、事务、Checkpoint 与 Flink/TiKV 嵌入对照。

【分布式 OLAP 查询引擎】Trino 查询路径:从 SqlQueryExecution 到 Page 流

主线拆解 Trino Coordinator 上 SqlQueryExecution 的生命周期:analyze、plan、fragment、Stage 调度到 Worker Task;Iceberg connector 如何从 snapshot/manifest 过滤生成 Split;Page 在 Operator 链上流动;EXPLAIN 与 EXPLAIN ANALYZE 字段判读。

【分布式 OLAP 查询引擎】DuckDB 与 DataFusion:嵌入式分析对照

从单进程向量化 pipeline 与 morsel-driven 并行出发,对照 DuckDB 1.5.4 与 Apache DataFusion 的 planner/executor 边界;说明何时选嵌入式读湖、何时必须上 Trino MPP;与 columnar-engine DuckDB 存储篇分工,并用本机实测 EXPLAIN 与 Parquet 投影下推数据锚定结论。

【分布式 OLAP 查询引擎】Iceberg 下推全链路:Planner 视角

与 lakehouse/18 分工:那边讲四层读湖漏斗是什么;本篇讲 Trino/Spark/DuckDB 在 SQL 优化链的哪一步把谓词变成 layout constraint、谁调用 Iceberg planning、split 如何携带残余谓词。引用官方文档与 lakehouse/18 本机 PyIceberg 实测,不伪造 Trino 计划输出。

【分布式 OLAP 查询引擎】引擎选型与数据平台阅读地图

用决策树收束 Trino/Spark/ClickHouse/DuckDB/DataFusion/PostgreSQL 的适用边界:交互式联邦、批 ETL、嵌入式分析、流批一体各走哪条路径;给出能力对照表(无吞吐排名)与 postgresql→columnar→lakehouse→stream→query-engine 全栈阅读顺序,闭合数据平台栈。

【分布式 OLAP 查询引擎】Trino · Spark · DuckDB · 优化与 MPP 执行

闭合数据平台栈最后一块:从 SQL 解析与 Calcite 式优化,到 Volcano/向量化执行、Trino Coordinator/Worker 与 shuffle,再到 Iceberg connector 下推与生产排查。承接 lakehouse 第 18 章读湖视角,补全「谁在做 planning」的引擎内核层。

【数据湖与开放表格式】Lakehouse 全景:从 Hive 表到开放表格式

Hive 目录式分区表把『表』等同于『一组目录加 metastore 里的分区行』,于是没有原子提交、planning 要 LIST 目录、schema 与分区演进常要重写。本文用这三个硬伤切入,讲清 lakehouse 把表拆成『不可变数据文件 + 可变元数据指针 + catalog』三层后各自解决了什么,并给出全系列的分层地图。

【数据湖与开放表格式】Parquet 文件格式深拆

拆 Parquet 的物理结构:file → row group → column chunk → page,footer 里的 FileMetaData(Thrift)与 PAR1 magic。讲清 PLAIN/RLE-bitpacking/字典/DELTA_BINARY_PACKED/BYTE_STREAM_SPLIT 各自压谁,Dremel 的 repetition/definition level 如何表达嵌套,column index/offset index 与 split-block bloom filter 怎样让谓词在读盘前裁掉 page。基于本机 pyarrow 24.0.0 真实 dump footer 与编码。

【数据湖与开放表格式】ORC 文件格式与 Parquet 对照

ORC 用 stripe 而非 row group、用三级统计(file/stripe/row-group index)而非独立 page index、用 PRESENT/DATA 等 stream 而非 page 组织一列。本文按 ORC 规范拆其文件尾(postscript + footer)、stripe 内部结构与 RLEv2 整数编码,并用本机 pyarrow 24.0.0 把同一份 30 万行数据写成 ORC 与 Parquet,对比真实体积与物理布局,最后给出什么场景仍用 ORC。

【数据湖与开放表格式】Apache Arrow 内存格式与零拷贝

拆解 Arrow 列式内存布局(validity bitmap + value buffer + offset buffer)、零拷贝从何而来,以及 C Data Interface、IPC、Flight 三层跨边界传递。讲清 Arrow(内存计算格式)与 Parquet(磁盘存储格式)如何分工衔接。含 pyarrow 实测 C Data Interface 同地址零拷贝。

【数据湖与开放表格式】列式编码与压缩

拆解 Parquet 的两层缩减:专用编码(dictionary / RLE / DELTA_BINARY_PACKED / BYTE_STREAM_SPLIT)降熵,再用 zstd/snappy/lz4/gzip 压字节。用 pyarrow 在同一列上实测不同编码+压缩组合的体积与读取耗时(3M 行,7 轮中位数),并与 ClickHouse CODEC 做同思想不同落地的对照。

【数据湖与开放表格式】表格式为什么存在

目录式分区表(Hive 表)在对象存储上有三处硬伤:并发写部分提交、list planning 太贵、缺快照隔离与原子提交。本文拆开放表格式补上的四件事——原子提交、快照隔离、文件级统计裁剪、schema 与分区演进,并抽象出三家共有的『元数据指针 + 不可变数据文件』骨架。

【数据湖与开放表格式】Iceberg 元数据树

拆解 Iceberg 的四层元数据:catalog 指针 → metadata.json → manifest list(snapshot)→ manifest file → data file。讲清 snapshot 与 manifest 里的分区数据和列级 stats(lower/upper bound、null/value count)如何让一次查询不 list 目录就收敛到文件集合,并给出表规范 V1/V2/V3 的版本边界。基于 pyiceberg 0.11.1 真实建表逐层 dump。

【数据湖与开放表格式】隐藏分区与分区演进

拆解 Iceberg 的 partition spec 与 transform(identity/bucket[N]/truncate[W]/year/month/day/hour/void):隐藏分区如何让查询不写分区列谓词也能裁剪,分区演进为何不重写历史数据(文件携带所属 spec),以及与 Hive 静/动态分区的本质差异。基于 pyiceberg 0.11.1 真实演进 spec 并观察新旧文件。

【数据湖与开放表格式】行级删除与 Merge-on-Read

Iceberg 在不可变文件上做行级删除的两条路线:copy-on-write(重写整文件)与 merge-on-read(写 delete 文件,读时合并)。讲清 position delete 与 equality delete 的语义、字段与作用域规则,写放大/读放大的取舍,V2 delete file 到 V3 deletion vector(Puffin 承载)的差异与迁移,以及读路径如何把 data file 与 delete 合并出可见行。基于 pyiceberg 0.11.1 实测 CoW 写放大并观察 MoR 回退。

【数据湖与开放表格式】提交协议与并发控制

没有数据库进程,Iceberg 怎么在对象存储上做原子提交与并发控制?拆解提交=catalog 对元数据指针做 compare-and-swap,乐观并发如何基于当前 snapshot 生成新 snapshot、冲突按操作类型与隔离级别重试,不同 catalog 的原子性来源(DB 行锁/CAS、REST 后端、对象存储条件写、文件系统 rename),以及 REST Catalog 的 requirements+updates 提交语义。基于 pyiceberg 0.11.1 实测并发冲突与重试。

【数据湖与开放表格式】Delta Lake 事务日志

拆解 Delta Lake 的 _delta_log:有序 JSON commit 里的 add/remove/metaData/protocol/commitInfo/txn 七类 action、每 N 次 parquet checkpoint 与 _last_checkpoint、protocol 版本与 reader/writer table features、deletion vector(Delta 的 merge-on-read)、liquid clustering 与 Z-order,以及乐观并发如何完全基于日志做冲突检测。

【数据湖与开放表格式】Apache Hudi

拆解 Apache Hudi 的内核:CoW 与 MoR 两种表类型、.hoodie 下的 timeline 与 instant 三态、file group/file slice 的存储模型、base file 与 log file、compaction/clustering/cleaning,以及 bloom/simple/record-level/bucket 索引体系为何让 Hudi 强在 upsert,最后讲 snapshot/read-optimized/incremental 三种查询类型。锚定 Hudi 1.x 官方文档。

【数据湖与开放表格式】Iceberg、Delta、Hudi 对照与互通

把前面 08–13 章拆过的 Iceberg、Delta、Hudi 放在一个坐标系里对照:元数据模型、行级更新、并发控制、引擎生态四维,每维标清口径。再讲两条互通路线——Delta UniForm(写时同步生成 Iceberg/Hudi 元数据)与 Apache XTable(事后转换元数据),以及它们的边界。最后给一棵按写入模式/引擎栈/更新频率展开的选型决策树,不做排名。

【数据湖与开放表格式】查询引擎如何读湖

拆解查询引擎读 Iceberg/Delta 的下推链路:partition pruning(manifest)→ file pruning(manifest stats)→ row-group/page pruning(Parquet column index)→ 字典过滤。对照 Trino/Spark/DuckDB/DataFusion/ClickHouse 的能力差异,讲清 planning 在哪一层完成、stats 从哪来,并用本机 pyiceberg + DuckDB 实测裁剪效果。

【数据湖与开放表格式】流式写入与 CDC 入湖

拆解流式数据进入 Iceberg/Delta/Hudi 的入湖侧机制:Flink/Kafka Connect/Spark sink 如何提交、exactly-once 怎样把引擎 checkpoint 与表格式的原子提交对齐、CDC 如何借 equality delete 与 record index 做 upsert,以及高频提交与小文件、compaction 的拉扯。只讲入湖侧,流处理引擎本身的窗口与状态留给后续。

【数据湖与开放表格式】湖上 AI 与向量

湖仓如何承接 AI 负载:embedding/特征/训练样本存湖、按 snapshot 固定数据版本做可复现训练,以及 Parquet 在随机访问和向量检索上的短板。用本机实测对比 Lance 与 Parquet 的顺序扫描与按行随机 take,讲清 Lance 为何为随机访问与向量而生,并划清湖侧存储与专用向量引擎的边界。

【数据湖与开放表格式】Parquet · Iceberg · Delta · Hudi 内核拆解

拆解 lakehouse 的两层基础:列式文件格式(Parquet/ORC/Arrow)与开放表格式(Iceberg/Delta/Hudi)。讲清没有数据库进程时,如何在对象存储上做 ACID、行级更新、快照与并发,以及 catalog、查询引擎、流式入湖如何拼成可运维的湖仓。面向数据平台工程师与从 OLAP/数仓转型的开发者。

【PG 内核】进程模型与共享内存:Postmaster 如何管理 100 个 Backend

拆解 PostgreSQL 多进程架构的核心:Postmaster 的启动与信号处理、Backend 进程的 fork()→InitPostgres→主循环生命周期、CreateSharedMemoryAndSemaphores() 的共享内存初始化流程、PGPROC/ProcArray/PGXACT 等关键共享内存结构的内存布局,以及 Background Worker 的注册与调度。理解了这个地基,才能理解 PG 为什么用进程而不是线程,以及 max_connections 为什么不能随便调大。

【PG 内核】页面布局与元组格式:PG 如何把一行数据塞进 8KB

拆解 PostgreSQL 的物理存储层:Page 的 8KB 布局(PageHeaderData、ItemId 数组、special space)、HeapTupleHeaderData 的字段语义(xmin/xmax/ctid/t_infomask/t_infomask2)、TOAST 外存机制的压缩阈值与四种策略(PLAIN/EXTENDED/EXTERNAL/MAIN),以及用 pageinspect 扩展直接观察页面字节。理解页面格式是理解 VACUUM、Index Scan、MVCC 可见性判断的共同前提。

【PG 内核】MVCC 实现:CLOG、hint bit 与快照可扩展性

在已有 MVCC 文章基础上深入 PG 并发控制的三个基础设施:CLOG 的 SLRU 结构(事务状态位、页面格式、SLRU 淘汰)、hint bit 的写入时机和竞争问题(何时写、谁写、写坏了怎么办)、PG 14 snapshot scalability 优化的具体机制(ProcArrayLock 为什么是瓶颈、xid/xmin 的原子更新如何减少持锁路径),以及事务 ID 回卷(wraparound)的威胁模型。最后与 InnoDB undo log 方案做系统性对比。

【PG 内核】WAL 内部机制:从事务提交到磁盘刷写

拆解 PostgreSQL WAL 的完整内部机制:XLogInsert() 从分段锁到 WAL Buffer 的插入路径、XLogRecord 的物理布局(Header + Block Headers + Data)、Checkpoint 的两阶段流程与 IO 摊平算法、REDO 恢复的 RMGR 分发、wal_level 三级差异的 WAL 记录对比。运维部分聚焦 checkpoint IO 风暴的根因与 checkpoint_completion_target 的调优陷阱、max_wal_size 设小导致 WAL 段疯狂切换的机制,以及用 pg_waldump 定位问题 WAL record 的实操方法。

【PG 内核】Buffer Manager:为什么 shared_buffers 不是越大越好

拆解 PostgreSQL Buffer Manager 的核心机制:shared_buffers 的内部组织(BufferDescriptors 数组、Buffer Table hash table、buffer pool)、Clock sweep 替换算法的完整源码路径、buffer 四态状态机与 pin/unpin 协议、bgwriter 的触发条件与脏页写入策略、BAS_BULKREAD/BAS_VACUUM ring buffer 的缓存隔离机制。用 pg_buffercache 实验观察 buffer 分布和 clock sweep 行为,解释为什么 shared_buffers 超过 8-10GB 后回报递减——double buffering、checkpoint IO 尖峰和 clock sweep 扫描延迟的三重反噬。

【PG 内核】锁管理器:从 SpinLock 到死锁检测的三层体系

拆解 PostgreSQL 锁管理器的完整架构:SpinLock 自旋锁的硬件原语与使用边界、LWLock 从 PG 9.4 前到 PG 16 LWLockWaitListLock 的三代演进、Heavyweight Lock 的 LockAcquire() 完整路径和锁表结构、死锁检测 DeadLockCheck() 的等待图 DFS 算法、行级锁 FOR UPDATE/FOR SHARE/FOR KEY SHARE 的 t_infomask 实现,以及用 pg_locks 和 pg_blocking_pids() 追踪生产锁等待链的诊断方法。

【PG 内核】事务与子事务:Savepoint 的 TransactionState 栈和 2PC 的状态文件

拆解 PostgreSQL 事务系统的三层结构:事务状态机 TransState 的状态转换路径、子事务(savepoint)的 TransactionState 栈与 ResourceOwner 嵌套管理、两阶段提交(2PC)的 WAL 记录与 pg_twophase 状态文件格式、事务 ID 分配的 xidStopLimit/xidWrapLimit 防线。附带 2PC 泄露的排查 SQL 和子事务栈过深的故障案例。

【PG 内核】VACUUM 与 Freezing:膨胀的根因和 Wraparound 危机

拆解 PostgreSQL VACUUM 的完整内部流程:heap scan、dead tuple 回收、索引清理、FSM/VM 更新。深入可见性映射和空闲空间映射的结构设计,以及 Index-Only Scan 如何依赖 VM 判断页面全可见。解析 Freezing 机制与事务 ID 回卷防御,Autovacuum 的触发阈值和 cost-based delay。最后用一条从 n_tup_del 增长到数据库强制只读的完整危机时间线,讲清楚 Anti-wraparound VACUUM 的预警信号链、典型陷阱和排查方法。

【PG 内核】查询解析与重写:从 SQL 字符串到 Query Tree

拆解 PostgreSQL 查询编译的前两步:Parser 如何将 SQL 字符串转换为 RawStmt 语法树(基于 gram.y 的 Bison 语法文件),Analyzer 如何通过 parse_analyze() 完成表名/列名解析、类型推导和权限检查,Rewriter 如何基于 pg_rewrite 规则系统展开视图和行级安全策略,以及 Query 结构体中 rtable、jointree、targetList 等核心字段的含义。配合 debug_print_parse 和 debug_print_rewritten 参数,读者可以自己观察每一步的输出。

【PG 内核】查询规划器 — 统计信息与代价模型:优化器为什么选错了索引

拆解 PostgreSQL 查询优化器的决策基础:pg_statistic 中 MCV/histogram/correlation 的存储结构、ANALYZE 的采样流程与精度边界、clauselist_selectivity 如何逐层估算选择率、seq_page_cost 等代价常量的物理意义与调优依据、CREATE STATISTICS 解决多列相关性问题、以及统计信息漂移的诊断 SQL 与排查路径。读完你能回答:优化器为什么选 Seq Scan 而不是你建的索引,以及怎么定位根因。

【PG 内核】查询规划器 — Join 顺序与路径生成:优化器如何选中 Nested Loop

拆解 PostgreSQL 查询优化器的路径生成:make_one_rel() 从基表访问到 Join 路径的完整流程、四种扫描路径 (SeqScan/IndexScan/IndexOnlyScan/BitmapScan) 的创建条件、三种 Join 方式 (NestLoop/HashJoin/MergeJoin) 的代价比较与选择逻辑、动态规划到 GEQO 遗传算法的切换条件 (geqo_threshold)、并行路径的生成机制。配 EXPLAIN (ANALYZE, BUFFERS) 输出与 planner 内部决策的逐项对照实验。

【PG 内核】执行器与表达式求值:从计划树到行数据的一趟流水

拆解 PostgreSQL 执行器的火山模型(ExecInitNode→ExecProcNode→ExecEndNode)、Hash Join 内存化实现、EEO 表达式求值的 opcode 编译与解释执行机制、TupleTableSlot 的三种数据承载方式(virtual/heap/minimal)。附带查询 hang 住的完整诊断路径:pg_stat_activity 的 wait_event + pg_blocking_pids() 追踪锁等待链 + EXPLAIN ANALYZE 计划行数与实际行数差异定位。

【PG 内核】JIT 编译:为什么 PG 要把 WHERE 子句编译成机器码

拆解 PostgreSQL 的 LLVM JIT 编译机制:JIT 编译的触发决策流程(jit_above_cost 三级阈值)、LLVM 模块管理与惰性编译、表达式求值从 EEO opcode 到 LLVM IR 再到机器码的完整路径、Tuple 变形(deforming)的 JIT 加速原理,以及 JIT 在 OLAP 场景的实际加速效果、编译开销和适用边界。

【PG 内核】B-Tree 索引:页面分裂、rightlink 与去重

拆解 PostgreSQL B-Tree 索引的内核实现:BTPageOpaque 页面布局(high key / rightlink 的工程意义)、_bt_doinsert() 插入路径与 _bt_split() 页面分裂的完整流程(分裂点选择不是简单的 50/50)、PG 12+ 去重(deduplicate_items)的触发条件与 posting list 压缩策略、B-Tree WAL 记录类型与恢复,以及用 bt_page_items() 和 bt_metap() 观察索引内部结构的实验方法。

【PG 内核】GiST 索引:一套接口搞定几何、全文、数组——通用搜索树怎么把"像什么"变成索引查找

拆解 PostgreSQL GiST 索引的抽象算子接口(Consistent/Union/Penalty/PickSplit)、深度优先搜索与 Consistent 过滤的组合逻辑、Penalty 引导插入路径与 PickSplit 决定分裂策略的完整流程,以及 point_ops 的几何距离搜索和 tsvector_ops 的全文搜索两种典型实现。读完你会理解为什么 GiST 能用一个通用框架支持十几种数据类型,以及它什么时候比 B-Tree 好、什么时候该用 GIN 替代。

【PG 内核】GIN 索引:倒排索引的内部机制与 Fast Update

拆解 PostgreSQL GIN 索引的内部结构:entry tree、posting list、posting tree 三者各在什么条件下使用;Fast Update 的 pending list 设计与 gin_clean_pending_list 合并时机;gingetbitmap() 的 bitmap AND/OR 多关键词搜索合并流程;全文搜索 tsvector 与数组 _int4 的 GIN 实现;以及 GIN 与 GiST 在写性能、读性能、存储开销上的三角权衡和具体场景下的选择建议。

【PG 内核】BRIN 与其他索引:什么时候不建 B-Tree 反而更好

过一遍 BRIN 索引的范围摘要哲学——用每个 page range 一条摘要替代逐行索引,在 1TB 的表上创建时间从小时降到秒级。同时讨论两条"不建 B-Tree"的高性价比路径:Hash 索引在 PG 10+ 的 WAL 安全边界和 Bloom 索引的多列任意组合过滤。附带代价对比表和建索引决策树。

【PG 内核】流复制:从 WAL Sender 到 Slot 溢出的多米诺效应

拆解 PostgreSQL 流复制的完整内核路径:WAL Sender 的 WalSndLoop→XLogSendPhysical 发送链路、WAL Receiver 的 WalRcvLoop 接收与恢复链路、同步复制的三种语义与等待机制、Failover 时 Timeline 的 fork 原理与 split-brain 风险、Primary-standby 冲突的本质与 max_standby_streaming_delay 的 trade-off、Replication Slot 的内部结构。重点剖析 Slot 溢出多米诺效应——standby 宕机→slot 阻止 WAL 回收→pg_wal 填满磁盘→primary PANIC 的完整事件链,以及 wal_keep_size 与 slot 的互相影响。配合 pg_stat_replication 的三层延迟指标排查与 conflict_reason 解读。

【PG 内核】逻辑复制与逻辑解码:冲突处理与延迟放大

拆解 PostgreSQL 逻辑复制的完整内核路径:LogicalDecodingContext 从 WAL 解码出逻辑变更的内部流程、Reorder Buffer 按 COMMIT 顺序重排事务与 snapshot 重建机制、pgoutput 输出插件的二进制协议与行过滤变换、Publication/Subscription 模型的内核实现。重点剖析四种冲突类型的根因与修复边界——update_missing/delete_missing 为什么静默跳过而 duplicate_key 直接停摆、subscription 被 disable 后的数据追平策略、序列不在逻辑复制范围内的自增主键冲突陷阱、大事务在 reorder buffer 中的延迟放大效应。

【PG 内核】扩展系统与 FDW:PG 的 hook 机制如何让扩展影响 Planner 决策

拆解 PostgreSQL 扩展系统的两种核心机制:全局 hook 机制全景(planner_hook、ExecutorStart_hook、ProcessUtility_hook 等覆盖七个子系统)和 FDW(Foreign Data Wrapper)的 FdwRoutine 回调接口。重点分析 postgres_fdw 的 pushdown 机制——哪些 WHERE/ORDER BY/LIMIT 能推到远端执行、哪些被留在本地——以及扩展如何通过 GetForeignRelSize→GetForeignPaths→GetForeignPlan 三个回调影响 planner 的代价估算和路径选择。

【PG 内核】监控体系与告警设计:从内核机制出发定义该监控什么

不从 Grafana 模板照抄,而是从 PG 内核机制推导出必须监控的六个维度:连接与 wait_event、存储膨胀与 XID wraparound、WAL 与复制延迟、查询性能突变、锁等待链、以及 shared_buffers 命中率骗局。每个维度配具体 SQL 和指标解读,告警阈值给出内核依据而非拍脑袋数字,同时盘点 pg_stat_statements queryid 冲突、track_io_timing 开销、pg_stat_activity 自身代价等监控工具本身的陷阱。

【PG 内核】经典故障模式与排查手册:五个真实事故的内核根因

拆解 PG 生产环境中最危险的五种故障模式——连接风暴与 work_mem 连锁效应、事务 ID wraparound 危机完整时间线、replication slot 溢出多米诺效应、OOM 连锁 kill、长事务 idle in transaction 隐性破坏。每个故障给出可复现的触发方法、Mermaid 时序图标注事件节点和排查断点、排查 SQL 脚本和修复边界,以及监控埋点策略让下次提前发现而非事后救火。

【PG 内核】性能异常调查方法论:从现象到内核根因的五层调查链

不是工具箱罗列,而是一条按顺序推进的调查链:从 pg_stat_statements 定位可疑 queryid,到 EXPLAIN (ANALYZE, BUFFERS) 解剖执行计划,到 pg_stat_activity + wait_event 诊断等待类型,到 pg_locks + pg_blocking_pids() 追踪锁等待树,最后用 OS 层工具(iostat/perf/bpftrace)确认物理瓶颈。覆盖三个特殊场景:计划缓存的快慢切换、CPU 100% 无慢查询的 LWLock 自旋根因、命中率 99% 但 IO 打满的统计骗局。

【PG 内核】数据恢复与损坏应对:PITR、pg_resetwal 和页面损坏的边界

拆解 PostgreSQL 数据恢复路径的内部机制与操作边界:PITR 的三个关键窗口与 timeline fork 原理、pg_checksums 的校验粒度与盲区、pg_resetwal 的 hint bit 代价与 VACUUM FULL 陷进、pg_dump 并行调度的内部策略。重点在于每种操作做什么、不做什么、哪些后果不可逆。

【PG 内核】大版本升级与迁移实战:pg_upgrade --link 为什么快以及为什么没有回滚

拆解 pg_upgrade 的三种模式(--link 硬链接零拷贝、--clone CoW 快照、--copy 物理复制)的执行流程、内部机制和不可回滚的根本原因;逻辑复制跨版本迁移的低停机方案及序列/large object/DDL 三大盲区;四种常见坑的根因与应对;附带迁移方案决策树,从小库到大库选哪种方案一次说清。

【PG 内核】配置陷阱与生产最佳实践:11 个最危险的 GUC 和它们的正确设置

逐一拆解 11 个最容易被误解和配错的 PostgreSQL GUC 参数:shared_buffers 的 double buffering 反噬、work_mem 作为'每个操作'而非'每个查询'的内存炸弹、effective_cache_size 和 random_page_cost 如何误导优化器走向灾难计划、fsync=off 和 synchronous_commit=off 的数据丢失边界、huge_pages 在容器中的静默退化、maintenance_work_mem 不足导致 VACUUM 瘫痪、idle_in_transaction_session_timeout 为什么必须设、log_lock_waits 与 deadlock_timeout 的联动、以及 log_min_duration_statement 与 auto_explain 的日志洪水叠加。每条配查验 SQL 和 shell 命令——不是'设成 X 就好了',而是'通过什么视图和日志确认当前设置有问题'。

【PG 内核】PostgreSQL 内核机制深度拆解

从进程模型到磁盘页面、从 MVCC 到流复制——对 PostgreSQL 内核做完整的源码级拆解。不止步于源码分析:26 篇中 6 篇是运维实战——经典故障的根因与排查路径、性能调查的五层工具链、配置陷阱与恢复边界。面向想读懂 PG 内核源码、在生产环境排查过问题、准备给 PG 贡献代码的工程师。

【数据库前沿】【数据库研究前沿】Iceberg vs Hudi vs Delta:湖仓表格式的事务边界与选型

把 Apache Iceberg、Apache Hudi、Delta Lake 放在同一张表上比较:metadata layout、snapshot isolation、多写者 OCC 协议、schema 与 partition evolution,最后给出 iceberg vs hudi 选型矩阵与对象存储上的事务边界。

【数据库前沿】【数据库研究前沿】向量与标量的混合过滤检索:ACORN、Milvus、pgvector 的算法权衡

系统拆解 ANN 混合过滤检索(filtered vector search)里的 pre-filter、post-filter、in-filter 三种策略,覆盖 ACORN(SIGMOD 2024)的预测路由、Milvus/Qdrant 的 partition / pinned filter,以及 pgvector 的实际查询写法和 EXPLAIN 观察方法。

【数据库前沿】【数据库研究前沿】CXL 3.0 与内存池化:对缓冲池与共享内存模型的重塑

从 CXL 1.1 到 3.0 的协议演进、Type 1/2/3 设备分类,到 Pond、TPP 两篇 ASPLOS 2023 论文展示的云内存池化实践,再到 PostgreSQL / MySQL 在分层内存下的 buffer pool 调参方向,梳理 CXL 对数据库共享内存模型的重塑路径。

【数据库前沿】【数据库研究前沿】近数据处理与计算下推:Smart SSD 到 DPU Offload

从近数据处理(NDP)的基本动机出发,梳理 Samsung SmartSSD、ScaleFlux、Eideticom 等 computational storage 产品,SNIA 计算存储标准,BlueField DPU 对存储路径的改造,以及 YourSQL、POLARDB-NDP 等学术/工业工作;下半给出过滤、解压、CRC、加密这四类当前能真正落地的下推场景,并借 PostgreSQL FDW 的类比说明'下推'到底在下推什么。

【数据库前沿】【数据库研究前沿】持久内存退场之后:ZNS SSD 与下一代非易失内存

Intel Optane / 3D XPoint 产品线 EOL 之后,SOFORT、FPTree、RECIPE 等 PM 数据库的成果如何迁移?ZNS SSD 对 LSM-Tree 的意义、RocksDB 的 ZNS 适配、PMDK 兼容层的取舍,以及把 CXL memory 作为下一代非易失载体的可能性——本文给出一份面向工程师的'后 Optane 时代'清单。

【数据库前沿】【数据库研究前沿】TEE 数据库与 Oblivious 原语:EnclaveDB 与加密计算

从 SGX / SEV-SNP / TDX / ARM CCA 的硬件抽象出发,梳理 EnclaveDB、Opaque、ObliDB 三条研究主线,以及侧信道攻击对 TEE 数据库设计的约束;下半讨论 Azure Confidential SQL、AWS Nitro Enclaves 上做 OLAP 的工程边界与性能开销量级。

【数据库前沿】【数据库研究前沿】差分隐私数据库:PINQ、APEx 到生产级 DP-SQL

从 Dwork 2006 的差分隐私定义出发,梳理 PINQ、FLEX、APEx 三篇里程碑论文;讲清 Laplace、Gaussian、Exponential 三类噪声机制与组合定理;回顾美国 2020 人口普查的 DP 落地教训;下半给出 OpenDP / Google DP library 的 SQL 绑定现状与 Postgres 上聚合加噪的最小 demo。

【数据库前沿】【数据库研究前沿】加密查询的边界:FHE、可搜索加密与 PIR

梳理 FHE(BFV/BGV/CKKS、Microsoft SEAL、OpenFHE)、可搜索加密与 Private Information Retrieval(SealPIR、OnionPIR、Spiral)三条加密查询路线;讨论哪些查询形态在当前开销下可行——点查可以、join 不行——以及银行与医疗场景的真实落地模式。

【从零写一个 LSM-Tree 存储引擎】Compaction:LSM-Tree 的心脏手术

从零实现 LSM-Tree Compaction:最小堆多路归并迭代器、Level 分层与 Compaction 打分、Tombstone 下推、Version/VersionEdit/MANIFEST 版本管理,以及 Leveled/Size-Tiered/Universal 三种策略的量化对比。从零写一个 LSM-Tree 存储引擎系列第 4 篇。

【从零写一个 LSM-Tree 存储引擎】完整引擎 + Rust 重写对比

组装完整 LSM-Tree 存储引擎:DB 接口(Open/Put/Get/Delete/Iterator/Snapshot)、单写多读并发控制、启动恢复,然后用 Rust 重写核心模块,记录 5 个编译器不让我过的故事,最后三方 benchmark 对比。从零写一个 LSM-Tree 存储引擎系列第 5 篇。

【从零写一个 LSM-Tree 存储引擎】LSM-Tree 全景:为什么要先写日志再排序

从零理解 LSM-Tree 存储引擎的设计哲学:B-Tree 与 LSM-Tree 的本质差异,写放大/读放大/空间放大的三角权衡,以及 WAL、MemTable、SSTable、Compaction、Bloom Filter 各组件的角色与协作关系。从零写一个 LSM-Tree 存储引擎系列第 1 篇。