上一篇文章《PostgreSQL的元组、页面结构及索引查找原理》中介绍了postgresql数据库数据结构和索引查找过程,本文接着继续介绍下堆内元组和动态剪枝技术,这两个技术其实是相辅相成的。我们知道在数据库元组插入更新时,索引也需要进行相应维护,因为pg的老元组不会实时清理,那么在更新后索引中就会多出一条索引记录指向新元组,这样造成索引膨胀,维护代价变大。pg为了避免这个问题,从8.3版本开始采用HOT(heap only tuple)解决这个问题,下面简单介绍一下技术原理。
普通更新
如下图所示,当tuple发生更新后,需要新增一条tuple记录到页面中,此时索引中也对应新增了一条记录,该记录指向tuple2的line pointer。这样的话每次更新都需要在索引页面插入新纪录,维护开销太大,而且会造成索引膨胀。Pg采用hot技术解决这个问题。
HOT更新
在使用hot更新时,元组更新后不会在索引页面新建相应记录,而通过在新老元组上设置标志位使得老元组指向新元组,形成新旧元组“链”解决这个问题。
前一篇文章介绍过,在元组结构的t_informask2字段中有两个标记位,heap_hot_update和heap_only_tuple,在更新tuple1时,postgresql会将tuple1(老元组