73.7. 堆内元组(HOT)#
为了支持高并发,PostgreSQL 使用多版本并发控制(MVCC)来存储行。不过,MVCC 对更新查询也有一些缺点。具体来说,更新需要向表中加入新的行版本。这还可能要求为每个被更新的行新增索引条目,而移除旧的行版本及其索引条目可能代价很高。
为了帮助降低更新的开销,PostgreSQL 提供了一种名为堆内元组(HOT)的优化。该优化在以下情况下可行:
更新不会修改被该表索引(包括表达式索引和部分索引)引用的任何列。
包含旧行的页面上有足够的空闲空间容纳更新后的行。
在这种情况下,堆内元组提供两项优化:
不需要新增用于表示更新后行的新索引条目。
更新行的旧版本可以在日常操作期间被完全移除,包括在执行
SELECT时,而不必依赖周期性的清理操作。(这是因为索引并不引用它们的页面项标识符。)
总之,只有在索引使用的列未被更新时,才能产生堆内元组更新。要提高页面拥有足够空间进行
HOT 更新的可能性,你可以降低表的
fillfactor。即使不这样做,HOT 更新也仍然会发生,因为新行会自然迁移到新页面,而那些具有足够空闲空间容纳新行版本的现有页面也会被利用。系统视图
pg_stat_all_tables
可以用来监控 HOT 更新和非 HOT 更新的发生情况。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.