0Pricing
SQL Academy · 课时

MVCC 与膨胀成因

了解多版本并发控制、死元组为何会累积,以及长事务如何导致膨胀

MVCC 与膨胀成因 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

什么是 MVCC?

多版本并发控制。PostgreSQL 不采用锁定,而是保留一行的多个版本。读取者看到一致的快照;写入者创建新版本而不会阻塞读取者。

UPDATE 如何工作

UPDATE 不会在原位置修改行:

  1. 在事务 T 中将旧行版本标记为“死行”
  2. 写入新版本
  3. 其他事务根据其快照能够看到相应的版本

膨胀的原因

死版本会不断累积。即使行数保持不变,表也会变大。如果不清理,查询会扫描越来越多的死行。

VACUUM 何时回收空间

VACUUM 会将死行标记为可复用(在表文件内部)。除非文件末尾完全为空,否则它不会缩小文件。VACUUM FULL 会重写表——需要排他锁,速度很慢。

自动清理

PostgreSQL 会在后台运行自动清理。死行超过阈值时触发:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

导致膨胀的工作负载

  • 小型/热点表上的大量 UPDATE 流量
  • 大型 DELETE 批次(需要清理来释放空间)
  • 长事务会阻塞清理(持有快照)
  • 处于事务中空闲的会话会在繁忙表上累积死行

诊断膨胀

pgstattuple 扩展可以提供精确数值:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

长事务会阻塞 VACUUM

VACUUM 只能清理早于最早活动事务的行。处于事务中空闲 4 小时的会话意味着有 4 小时的死行无法回收。

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

回卷保护

事务 ID 为 32 位。如果自动清理跟不上,集群会面临“回卷”并进入安全模式(强制 VACUUM)。请监控:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

逻辑删除 ≠ 物理删除

DELETE 会将行标记为死行;只有 VACUUM 才能回收空间。批量 DELETE 后不执行 VACUUM,会留下大量死行。

HOT 更新

如果只更新未建立索引的列,且同一页面上存在空闲位置,PostgreSQL 会执行 HOT(仅堆元组)更新——无需修改索引,膨胀更少。

减少膨胀

  • 保持事务简短
  • 避免对已建立索引的列执行宽范围 UPDATE(否则无法触发 HOT)
  • 对频繁变更的表积极调优自动 VACUUM
  • 使用 pg_repack 重写表,避免长时间锁定

总结

MVCC 通过积累死行来实现并发。

  • VACUUM 会清理死行
  • 自动 VACUUM 至关重要——不要禁用它
  • 长事务会阻塞清理
  • 使用 pgstattuple 进行诊断

快速检查

即使只更改了一列,为什么 UPDATE 不会缩小表的大小?

常见问题解答

「MVCC 与膨胀成因」课时是免费的吗?

是的 — 「MVCC 与膨胀成因」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「MVCC 与膨胀成因」这节课中我会学到什么?

了解多版本并发控制、死元组为何会累积,以及长事务如何导致膨胀 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「MVCC 与膨胀成因」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. MVCC 与膨胀成因
  2. VACUUM、autovacuum、vacuum_cost_delay
  3. ANALYZE 与 pg_statistic
  4. 仅索引扫描与可见性映射
← 返回 SQL Academy