Heap-Only Tuples ( HOT )
为了支持高并发, PostgreSQL 使用 多版本并发控制 ( MVCC )来存储行。不过, MVCC 对更新查询也有一些缺点。具体来说,更新需要向表中加入新的行版本。这还可能要求为每个被更新的行新增索引条目,而移除旧的行版本及其索引条目可能代价很高。
当前查看 PostgreSQL 18.6。
说明
为了支持高并发, PostgreSQL 使用 多版本并发控制 ( MVCC )来存储行。不过, MVCC 对更新查询也有一些缺点。具体来说,更新需要向表中加入新的行版本。这还可能要求为每个被更新的行新增索引条目,而移除旧的行版本及其索引条目可能代价很高。
- 定义范围
- 同版本核心物理存储文档
手册定义
66.7. 仅堆元组(HOT)
为支持高并发,PostgreSQL 使用多版本并发控制(MVCC)存储行。但 MVCC 对更新查询也有不利之处:更新必须向表中添加新的行版本,可能还要为每个更新后的行添加索引项,而移除旧行版本及其索引项的成本可能很高。
为降低更新开销,PostgreSQL 提供了仅堆元组(heap-only tuples,HOT)优化。满足以下条件时可以使用:
-
更新不会修改被该表索引引用的任何列,摘要索引除外。核心 PostgreSQL 发行版中唯一的摘要索引方法是 BRIN。
-
包含旧行的页面上有足够的空闲空间容纳更新后的行。
在这种情况下,堆内元组提供两项优化:
-
不需要新增用于表示更新后行的新索引条目,不过摘要索引仍可能需要更新。
-
当一行被多次更新时,除最旧和最新版本之外的行版本,都可以在日常操作期间被完全移除,包括在执行
SELECT时,而不必依赖周期性的清理操作。(索引始终引用原始行版本的页面项标识符。与该行版本关联的元组数据会被删除,其项标识符会转换成一个重定向,指向某个并发事务仍可能可见的最旧版本。对任何人都不再可见的中间行版本会被完全移除,而相关的页面项标识符则可重新利用。)
要提高页面拥有足够空间进行 HOT 更新的可能性,你可以降低表的 fillfactor。即使不这样做,HOT 更新也仍然会发生,因为新行会自然迁移到新页面,而那些具有足够空闲空间容纳新行版本的现有页面也会被利用。系统视图 pg_stat_all_tables 可以用来监控 HOT 更新和非 HOT 更新的发生情况。
相关条目
文档与源码
来源构建
- 版本
- 18.6
- 构建
- https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
版本比较
PostgreSQL 17 → 18: 无变化。
比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。
相关条目
导出 JSON · 返回存储结构 · 收录范围为 PostgreSQL 11 至 20;最早采样版本不一定是实际引入版本。