为了实现高并发性,PostgreSQL 使用 多版本并发 控制 (MVCC) 来存储行。但是, MVCC 对于更新查询有一些缺点。 具体来说,更新需要将新版本的行添加到 表中。这还可能需要为每个更新的行添加新的索引条目, 并且删除旧版本的行及其索引条目的成本可能很高。
为了帮助减少更新开销, LightDB 进行了一项名为 仅堆元组 (HOT) 的优化。此优化在以下情况下可行:
更新不会修改表的索引引用的任何列,包括表达式和部分索引。
包含旧行的页面上有足够的可用空间来容纳更新后的行。
在这种情况下,仅堆元组提供了两种优化:
不需要新的索引条目来表示更新的行。
可以在正常操作(包括 SELECT
)期间完全删除已更新行的旧版本,而不需要定期执行 vacuum 操作。(这是可能的,因为索引不引用其页面项标识符。)
总之,仅当索引使用的列未更新时,才可以创建仅堆元组更新。您可以通过减少表的 fillfactor
来增加为 HOT 更新提供足够页面空间的可能性。如果您不这样做,HOT 更新仍会发生,因为新行将自然迁移到新页面和现有页面,并为新行版本提供足够的可用空间。系统视图 pg_stat_all_tables 允许监视 HOT 和非 HOT 更新的发生。