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

65.7. 仅堆元组 (HOT) #

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

为了帮助减少更新的开销,PostgreSQL 有一种称为仅堆元组 (HOT) 的优化。当以下情况发生时,这种优化是可行的:

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

  • 包含旧行的页面上有足够的可用空间来容纳更新的行。

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

  • 不需要新的索引条目来表示更新的行,但是,摘要索引可能仍然需要更新。

  • 当一行被多次更新时,除了最旧和最新的行版本之外,其他行版本可以在正常操作期间(包括SELECT)完全删除,而无需定期执行 vacuum 操作。(索引始终引用原始行版本的页面项标识符。与该行版本关联的元组数据被删除,并且其项标识符被转换为指向可能仍然对某些并发事务可见的最旧版本的重定向。不再对任何人可见的中间行版本将被完全删除,并且相关的页面项标识符可用于重用。)

您可以通过减少表的 fillfactor 来增加足够的页面空间用于HOT更新的可能性。如果您不这样做,HOT更新仍然会发生,因为新行自然会迁移到新页面,并且现有页面有足够的可用空间容纳新行版本。系统视图 pg_stat_all_tables 允许监视 HOT 和非 HOT 更新的发生。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。