支持的版本:当前 (16) / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11

73.7. 仅堆元组 (HOT) #

为了实现高并发性,PostgreSQL 使用多版本并发控制 (MVCC) 来存储行。但是,MVCC 对更新查询有一些缺点。具体而言,更新需要将新版本的行添加到表中。这也可能需要为每个更新的行创建新的索引项,并且删除旧版本的行及其索引项可能很昂贵。

为了帮助减少更新的开销,PostgreSQL 有一种名为仅堆元组 (HOT) 的优化。当满足以下条件时,可以进行此优化

  • 更新不会修改表索引(包括表达式和部分索引)引用的任何列。

  • 包含旧行的页面上有足够的空间用于更新的行。

在这种情况下,仅堆元组提供了两种优化

  • 不需要新的索引项来表示更新的行。

  • 更新行的旧版本可以在正常操作期间(包括 SELECT)完全删除,而无需定期执行 vacuum 操作。(这是可能的,因为索引不引用其页面项标识符。)

总之,仅当索引使用的列未更新时,才能创建仅堆元组更新。通过降低表的 fillfactor,可以增加 HOT 更新的足够页面空间的可能性。如果不这样做,HOT 更新仍会发生,因为新行会自然迁移到新页面,而现有页面有足够的空间容纳新行版本。系统视图 pg_stat_all_tables 允许监控 HOT 和非 HOT 更新的发生。

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。