版本:
目录导航

73.7. 仅存储在堆中的元组(HOT

为了实现高并发,PostgreSQL使用多版本并发控制MVCC)来存储行。然而,MVCC对于更新查询有一些不足之处。具体来说,更新需要向表中添加新版本的行。这也可能需要为每个更新的行添加新的索引条目,并且删除旧版本的行及其索引条目可能会很昂贵。

为了帮助减少更新的开销,PostgreSQL引入了一种优化称为 heap-only tuples(HOT)。 当以下条件满足时,这种优化才可能发生:

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

  • 包含旧行的页面有足够的空闲空间来存放更新后的行。

在这种情况下, heap-only tuples 提供了两种优化:

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

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

总之,只有在不更新索引使用的列时,才能创建 heap-only tuples 的元组。您可以通过减少表的 HOT更新的填充因子 fillfactor来增加足够页面空间的可能性。如果不这样做, HOT更新仍会发生,因为新行会自然迁移到新页面和具有足够空闲空间 用于新行版本的现有页面。系统视图 pg_stat_all_tables允许监视HOT和非HOT更新的发生。