openGauss数据库源码解析 | 存储引擎源码解析(3)

本文详细介绍了openGauss数据库中的行存储统一访存接口,包括TableAccessMethod的5类接口:TupleAM、SlotAM、TableScanAM、DQLAM、DMLAM和DDLAM,以及它们各自在元组操作、数据结构管理和SQL引擎交互中的作用,以实现对不同行存储子格式的抽象和兼容性.

4.2.2  行存储统一访存接口

如上所述,在openGauss中,提供行存储统一访存接口层,来屏蔽不同行存储子格式内部实现机制对SQL引擎的影响。该行存储统一访存接口层被称为Table Access Method层。根据SQL引擎对行存储表的访存方式,将访存接口分为5类,如表4-5所示。每一类接口的具体操作如表4-6至4-10所示。

表4-5  Table Access Method定义的访存接口

接口类别

接口含义

Tuple AM

Slot AM

元组(tuple)和元组槽(slot)操作抽象层,包括元组数据结构的抽象、元组操作的抽象,执行引擎无须关注元组属于哪种行存储子格式,只需调用元组数据结构基类的抽象操作接口,就可操作不同行存储子格式的元组,从而屏蔽不同行存储子格式物理元组结构、访问方法的差异

TableScan AM

表扫描(table scan)抽象层,包括TableScan数据结构的抽象、TableScan管理操作的抽象,执行引擎无须关注行存储子格式内部TableScan结构的差异,通过调用TableScan数据结构基类的抽象管理接口,就可完成不同行存储子格式的TableScan管理,屏蔽不同行存储子格式内部实现的差异

DQL AM

元组查询(data query language,DQL)操作抽象层,包括获取元组、元组可见性判断等查询操作的抽象

DML AM

元组写操作抽象层,包括元组插入、批插、删除、更新、锁定等接口的抽象

DDL AM

表物理操作抽象层,这里统称为DDL抽象层,涉及表物理文件操作的相关接口的抽象,例如CTAS、TRUNCATE、LOAD/COPY、VACUUM、VACUUM FULL、ANALYZE、REBUILD INDEX、ALTER TABLE RESTRUCT等DDL语法。该层也可以支持存储管理的抽象功能,如屏蔽不同行存储子格式的文件/目录管理模块、SMGR访问等差异

表4-6  Tuple AM、Slot AM类访存接口

接口名称

接口含义

tableam_tslot_clear

清理slot tuple,主要是被ExecClearTuple调用

tableam_tslot_materialize

该方法在ExecMaterializeSlot被调用, 将slot中的tuple进行local copy(本地拷贝)

tableam_tslot_get_minimal_tuple

获取slot中的minimal tuple(最小化元组),slot负责管理/释放minimal tuple的内存

tableam_tslot_copy_minimal_tuple

返回slot中minimal tuple的副本,该副本在当前内存上下文中被分配,需要调用者进行释放操作

tableam_tslot_store_minimal_tuple

此函数在指定的TupleTableSlot结构体中存储minimal tuple

tableam_tslot_get_heap_tuple

该函数获取slot中的tuple

tableam_tslot_copy_heap_tuple

该函数返回slot中tuple的副本,该副本在当前内存上下文中被分配,需要调用者进行释放操作

tableam_tslot_store_tuple

该方法将对应的物理元组存储到slot中

tableam_tslot_getsomeattrs

强制更新slot中tuple某个属性的values和isnull数组信息

tableam_tslot_getattr

获取当前slot中tuple的某个属性信息

tableam_tslot_getallattrs

强制更新slot中tuple的values和isnull数组

tableam_tslot_attisnull

检查slot中tuple的属性是否为null

tableam_tslot_get_tuple_from_slot

从slot中获取一个tuple,并根据relation结构体中行存储子格式信息转换为对应子格式的tuple

tableam_tops_getsysattr

获取tuple的系统属性

tableam_tops_form_minimal_tuple

根据values和isnull数组内容,新建一个tuple

tableam_tops_form_tuple

根据values和isnull数组内容,新建一个minimal tuple

tableam_tops_form_cmprs_tuple

根据values和isnull数组内容,新建一个被压缩的tuple

tableam_tops_deform_tuple

抽取指定tuple中的data数据到values和isnull数组

tableam_tops_deform_cmprs_tuple

抽取被压缩的tuple中的data数据到values和isnull数组

tableam_tops_computedatasize_tuple

计算需要构造的tuple的data区域的大小

tableam_tops_fill_tuple

根据values和isnull数组中的数据填充到tuple的data区域

tableam_tops_modify_tuple

根据一个旧tuple新建一个tuple并更新其values

tableam_tops_free_tuple

释放一个tuple的内存

tableam_tops_tuple_getattr

获取tuple的某个属性信息

tableam_tops_tuple_attisnull

检查tuple的属性是否为null

tableam_tops_copy_tuple

拷贝并返回一个tuple

tableam_tops_copy_minimal_tuple

拷贝并返回一个minimal tuple

tableam_tops_free_minimal_tuple

释放minimal tuple的内存

tableam_tops_new_tuple

新建一个tuple

tableam_tops_destroy_tuple

销毁一个tuple

tableam_tops_get_t_self

获取tuple中的self指针,指向自己在表中的位置

tableam_tops_exec_delete_index_tuples

删除索引的tuple

tableam_tops_exec_update_index_tuples

更新索引的tuple

tableam_tops_get_tuple_type

获取tuple属于哪种存储引擎

tableam_tops_copy_from_insert_batch

copy from场景进行批量INSERT(插入)

tableam_tops_update_tuple_with_oid

根据table OID(表的唯一标识号)更新tuple

表4-7  TableScan AM类访存接口

接口名称

接口含义

tableam_scan_begin

初始化scan结构体,准备执行table scan(全表扫描)算子

tableam_scan_begin_bm

准备执行bitmap scan(位图扫描)算子

tableam_scan_begin_sampling

初始化堆表(顺序)扫描操作

tableam_scan_getnexttuple

返回scan中的下一个tuple

tableam_scan_getpage

获取scan中的下一页

tableam_scan_end

结束scan,并释放内存

tableam_scan_rescan

重置scan

tableam_scan_restrpos

重置扫描位置

tableam_scan_markpos

记录当前扫描位置

tableam_scan_init_parallel_seqscan

初始化并行sequence scan(顺序扫描)

表4-8  DQL AM类访存接口

接口名称

接口含义

tableam_tuple_fetch

根据tid(元组物理位置)获取tuple

tableam_tuple_satisfies_snapshot

指定元组对于快照是否可见

tableam_tuple_get_latest_tid

获取tid指向的当前snapshot(快照)可见的最新物理元组

表4-9  DML AM类访存接口

接口名称

接口含义

tableam_tuple_insert

插入一条元组到表中

tableam_tuple_multi_insert

插入多条元组到表中

tableam_tuple_delete

删除一条元组,返回并发冲突状态,由调用者根据并发冲突状态决定下步操作

tableam_tuple_update

更新一条记录,返回并发冲突状态,由调用者根据并发冲突状态决定下步操作

tableam_tuple_lock

锁定一条元组

tableam_tuple_lock_updated

解锁一条元组

tableam_tuple_check_visible

检查元组的可见性

tableam_tuple_abort_speculative

终止upsert操作的尝试插入操作,转为更新操作

表4-10  DDL AM类访存接口

接口名称

接口含义

tableam_index_build_scan

该方法用于创建索引的首次全表扫描

tableam_index_validate_scan

该方法用于并发创建索引的第二次全表扫描

tableam_relation_copy_for_cluster

将源表数据根据指定的聚簇方式复制到新表中

对于每一个行存储子格式,需要提供上述这五类访存接口的各自实现方式,并注册到g_tableam_routines全局行存储访存接口数组中。SQL引擎在调用某个访存接口时,根据Relation结构体中表的子格式类型(rd_tam_type成员),来调用对应的子格式访存接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值