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

被折叠的 条评论
为什么被折叠?



