我们知道在数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价很大,可能造成索引分裂。Pg为了避免这个问题,采用了HOT(堆内元组技术)解决这个问题,下面我们就这个技术详细探讨一下。
我们先看看postgresql中page的结构:
Pd_lsn:本页面最后一次变更所写入的xlog记录对于的lsn。
Pd_checksum:页面校验和。
Pd_lower:指向行指针的末尾(空闲空间开始位置)。
Pd_upper:指向最新堆元组的起始位置(空闲空间结束位置)。
Pd_special:用在索引页中,在索引页中它指向特殊空间的起始位置,在堆表页面中它指向页尾。
Pd_pagesize_version:页面大小以及页面布局的版本号。
Pd_prune_xid:本页面可以修剪的最老元组的xid。
从上面的结构我们可以看到,pd_lower和pd_upper分别指向空闲空间的起始和终止位置,而图中的1和2是行指针,分别指向真实的元组位置。
了解了page的结构后我们再来看看元组的结构:
T_mix:插入此元组的事务txid。
T_max:删除或更新此元组的事务txid&#