PostgreSQL HOT(Heap Only Tuple) 技术

2023年 8月 15日 35.4k 0

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。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论