跳转到内容

阶段三 · MVCC

这是全书最关键的一段。 如果只读一个阶段,读这个。

Postgres 的很多「怪行为」——表会膨胀、count(*) 慢、长事务危险、VACUUM 是个必须操心的东西——都不是独立的知识点,而是同一个设计决策的连锁后果。理解了 MVCC,它们会自己解释自己。

  • 元组版本:xmin / xmax / ctidUPDATE 的真实语义 → 详见
  • HOT 更新与 fillfactor
  • 死元组、表膨胀,以及膨胀为什么不会自己消失
  • VACUUM 做的三件事,autovacuum 的触发条件
  • 冻结与事务号回卷(wraparound)
  • 快照的数据结构:xmin / xmax / xip_list
  • 为什么 Postgres 的 UPDATE 本质是「插入新版本 + 标记旧版本」?
  • 一个跑了 3 小时的只读事务,为什么会导致其他表膨胀?
  • HOT 更新的触发条件是什么?为什么它和 fillfactor 有关?
  • 事务号回卷是什么?为什么会逼数据库强制停机?
  • 为什么 count(*) 在 Postgres 上比 MySQL 慢?