PostgreSQL HOT(Heap Only Tuple) 技术

1. PostgreSQL HOT 技术

PG 对一条数据进行更新时,并不直接在原数据上直接更新,而是采用创建一条新记录的方式间接进行更新。由于数据的行号(ctid) 发生了变化,如果字段上有索引,这种更新机制就必须要对索引也同步进行更新。在索引数量较多的情况下,会严重影响更新效率。

基于以上问题,PG 引入了 HOT(Heap Only Tuple) 技术,即堆内元组技术。主要原理就是在不涉及索引字段的更新时,老的记录作为一个中间跳转指向新的记录,索引仍然指向老记录,索引信息不必同步更新。这里有一个前提,老记录和新记录必须在一个页面里。

2. HOT 技术存储层实现细节

t_informask2 标识:

  • 老元组标记为 HEAP_HOT_UPDATED
  • 新元组标记为 HEAP_ONLY_TUPLE

t_ctid 标识:

老元组的 t_ctid 指向 新元组,新元组的 t_ctid 指向自己。

3. HOT 技术 WAL 日志实现细节

对于一个涉及 HOT 的 update 操作,其在 wal 日志中的存储格式主要表现在 xl_heap_update 结构,在该结构中存储了new tuple 在页内的偏移号和 old tuple 在页内的偏移号。

typedef struct xl_heap_update
{
	TransactionId old_xmax;		/* xmax of the old tuple */
	OffsetNumber old_offnum;	/* old tuple's offset */
	uint8		old_infobits_set;	/* infomask bits to set on old tuple */
	uint8		flags;
	TransactionId new_xmax;		/* xmax of the new tuple */
	OffsetNumber new_offnum;	/* new tuple's offset */
} xl_heap_update;

新的元组存储在 block_id 为 0 的块上,如果不是 XLOG_HEAP_HOT_UPDATE,旧的元组将会存储在 block_id 为 1 的块上。如果 block_id 为 1 的块没有被使用,那么则认为是 XLOG_HEAP_HOT_UPDATE。

文章评论

0条评论