NEIL CHEN / NOTES
写下思考
关于 PostgreSQL、系统设计与开发实践的思考和记录。
2026
10 月 的文章,展开或收起
-
从索引命中到查询结果
索引找到候选位置后,查询还要处理版本可见性、必要的条件复验和剩余过滤。从几份执行计划出发,看 Bitmap、Index Only Scan 和 GIN 怎样通过 AM 接口接上这些工作。
-
国产数据库,最后靠什么赢得信任?
从一张感冒处方,想到国产数据库的信任问题:客户花的钱,到底买到了什么?
-
B-tree 里的重复 Key 与旧记录的清理
从一次阻止了 HOT 的普通 UPDATE 出发,解释 Unique Index 为什么允许重复 Key、B-tree 如何在插入路径上清理旧版本,以及 VACUUM 清理完成之后,空间为什么仍可能留在 Index 文件里。
-
B-tree 的并发搜索与页面分裂
一个 Backend 拿着过期的 Downlink 走进旧 Page,另一个刚好完成了 Split。High Key、Rightlink 以及 Incomplete Split,如何让这次并发搜索继续找到正确的 Key。
-
Heap Page 里的旧版本,什么时候会被清理
从一个 DELETE 留下的死元组出发,看它经过 Visibility Horizon、Page Pruning、LP_DEAD 和 Index Cleanup,最后能变成什么样;以及 VACUUM FULL 为什么要重新造一份 Heap。
9 月 的文章,展开或收起
-
PostgreSQL 是怎么把 Tuple 写进 Heap 的
顺着一次 Tuple 写入,看看 FSM、Visibility Map、Buffer Lock 和 WAL 是怎么在 Heap AM 里接到一起的。
-
Checkpoint 调优,到底在调什么?
Checkpoint 引起的 I/O 尖峰和延迟抖动,可能来自触发太频繁,也可能来自某一轮写得太重。把一次 Checkpoint 拆成 trigger、write、sync 三段,再顺着 WAL、pg_wal 和 Recovery 往下看,这几个参数各自管什么就清楚了。
-
Checkpoint、BgWriter、WAL Writer,PG 的三个后台写进程
Checkpointer、Background Writer 和 WAL Writer 都会在后台写盘,但它们守的是三个不同的边界:Recovery 从哪里开始、Buffer 能不能顺利复用、WAL 推进到了哪里。这三个边界之间,又一直在互相借力。