为了允许高并发,PostgreSQL 使用 多版本并发控制 (MVCC) 来存储行。但是,MVCC对更新查询有一些缺点。具体来说,更新需要将行的新的版本添加到表中。这可能还需要为每个更新的行添加新的索引条目,并且删除行及其索引条目的旧版本可能很昂贵。
为了帮助减少更新的开销,PostgreSQL 有一个名为堆只元组的优化 (HOT)。这种优化在以下情况下是可能的
更新没有修改表索引引用的任何列,不包括汇总索引。核心 PostgreSQL 发行版中唯一的汇总索引方法是 BRIN。
包含旧行的页面上有足够的可用空间来容纳更新后的行。
在这种情况下,堆只元组提供了两种优化
不需要新的索引条目来表示更新的行,但是汇总索引可能仍然需要更新。
当行被多次更新时,除了最旧和最新的行版本之外,其他行版本可以在正常操作期间完全删除,包括 SELECT
,而不是要求定期 vacuum 操作。(索引始终引用原始行版本的 页面项标识符。与该行版本关联的元组数据被删除,其项标识符被转换为指向可能仍对某些并发事务可见的最旧版本的重定向。不再对任何人可见的中间行版本被完全删除,并且关联的页面项标识符被释放以供重复使用。)
您可以通过减少表的 fillfactor
来增加页面空间充足以进行HOT更新的可能性。如果您不这样做,HOT更新仍然会发生,因为新行会自然迁移到新的页面,以及现有页面将有足够的空间容纳新的行版本。系统视图 pg_stat_all_tables 允许监视 HOT 和非 HOT 更新的发生。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。