华为openGauss数据库源码解析——堆表操作(1)

本文详细介绍了数据库中的堆表概念,包括堆表的无序存储特性及与索引表的区别。堆表存储数据主体,索引表存储索引键。HOT技术在更新时避免插入新的索引元组。文章还解析了数据库操作函数如heap_open、heap_beginscan、heap_getnext等,涉及扫描、插入、删除和更新等操作,以及如何处理堆表中的hot更新元组。

所谓堆表,是指元组无序存储,数据按照“先来后到”的方式存储在页面中的空闲位置。作为对比,在索引表中,元组根据索引键键值的排序,在页面内部有序存储,且各个页面之间在逻辑上也是有序存储的。堆表存储数据主体,索引表仅存储索引键键值以及对应的、完整元组的物理位置(即完整元组在堆表中的页面号和页内偏移)。

HOT技术(堆内元组技术),在更新时通过修改指针指向定位新元组,而不需要插入相应的索引元组。

在更新tuple1时,会将tuple1(老元祖)的标记位置为heap_hot_update,同时tuple2(新元组)的标记位置为heap_only_tuple。

Heap_Only_tuple说明是hot-chain中的新元组

假设page中有个元组被多次hot更新,只有最老的元组是Heap_hot_Update

只有最新的元组是heap_only_tuple

其他元组既是Heap_hot_Update又是heap_only_tuple

下面对数据库中有关堆表操作的函数进行分析,介绍函数的作用和执行流程,具体细节可以结合openGauss的源码一起浏览。

堆表访问接口函数

Relation heap_open(Oid relationId, LOCKMODE lockmode, int2 bucketid)
#define  heap_close(r,l)  relation_close(r,l)
TableScanDesc heap_beginscan(Relation relation, Snapshot snapshot, int nkeys, ScanKey key, RangeScanInRedis rangeScanInRedis)
static HeapScanDesc heap_beginscan_internal(Relation relation, Snapshot snapshot, int nkeys, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

allwellright

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值