HOT更新(Heap-Only Tuple update)是对索引的一种优化。
一般情况下,一个元组被更新时会将原本的元组标记为已删除,并插入一个新的元组。 这需要更新表内的所有索引。 除了缓存命中问题以外,索引并不会删除对已失效元组的引用,这会导致索引存储较多的过时元组。要求更频繁的索引剪枝。
当元组更新的列没有被任何一个索引引用时,HOT更新会避免更新索引,而是通过旧元组项的 ctid 指针将元组由旧到新连接,形成一个单向链表。
当通过索引访问到旧元组时,PostgreSQL 发现元组的 ctid 指针非空,会继续访问 ctid 指向的更新的元组,直到 ctid 指针为空。