阶段三 · MVCC
这是全书最关键的一段。 如果只读一个阶段,读这个。
Postgres 的很多「怪行为」——表会膨胀、count(*) 慢、长事务危险、VACUUM 是个必须操心的东西——都不是独立的知识点,而是同一个设计决策的连锁后果。理解了 MVCC,它们会自己解释自己。
- 元组版本:
xmin/xmax/ctid,UPDATE的真实语义 → 详见 - HOT 更新与
fillfactor - 死元组、表膨胀,以及膨胀为什么不会自己消失
VACUUM做的三件事,autovacuum 的触发条件- 冻结与事务号回卷(wraparound)
- 快照的数据结构:
xmin/xmax/xip_list
- 为什么 Postgres 的
UPDATE本质是「插入新版本 + 标记旧版本」? - 一个跑了 3 小时的只读事务,为什么会导致其他表膨胀?
- HOT 更新的触发条件是什么?为什么它和
fillfactor有关? - 事务号回卷是什么?为什么会逼数据库强制停机?
- 为什么
count(*)在 Postgres 上比 MySQL 慢?