↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11
预发布版本文档。 PostgreSQL 19beta4 为测试版本,最终发布内容可能有所不同。

66.7. 堆内元组(HOT)#

为了支持高并发,PostgreSQL 使用多版本并发控制(MVCC)来存储行。不过,MVCC 对更新查询也有一些缺点。具体来说,更新需要向表中加入新的行版本。这还可能要求为每个被更新的行新增索引条目,而移除旧的行版本及其索引条目可能代价很高。

为了帮助降低更新的开销,PostgreSQL 提供了一种名为堆内元组(HOT)的优化。该优化在以下情况下可行:

  • 更新不会修改被该表索引引用的任何列,摘要索引除外。核心 PostgreSQL 发行版中唯一的摘要索引方法是 BRIN。

  • 包含旧行的页面上有足够的空闲空间容纳更新后的行。

在这种情况下,堆内元组提供两项优化:

  • 不需要新增用于表示更新后行的新索引条目,不过摘要索引仍可能需要更新。

  • 当一行被多次更新时,除最旧和最新版本之外的行版本,都可以在日常操作期间被完全移除,包括在执行 SELECT 时,而不必依赖周期性的清理操作。(索引始终引用原始行版本的页面项标识符。与该行版本关联的元组数据会被删除,其项标识符会转换成一个重定向,指向某个并发事务仍可能可见的最旧版本。对任何人都不再可见的中间行版本会被完全移除,而相关的页面项标识符则可重新利用。)

要提高页面拥有足够空间进行 HOT 更新的可能性,你可以降低表的 fillfactor。即使不这样做,HOT 更新也仍然会发生,因为新行会自然迁移到新页面,而那些具有足够空闲空间容纳新行版本的现有页面也会被利用。系统视图 pg_stat_all_tables 可以用来监控 HOT 更新和非 HOT 更新的发生情况。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.