如何插件化地为openGauss添加算子

本文介绍了如何通过插件化方式为openGauss数据库添加TidRangeScan算子,详细阐述了从优化器到执行器的实现过程,包括路径规划、计划创建和执行层hook点,旨在提升数据库处理效率。
摘要由CSDN通过智能技术生成

1.1 openGauss执行算子汇总

openGauss的算子按类型可分为四类:控制算子、连接算子、扫描算子和物化算子。下面汇总了当前(openGauss2.0.0)已有的算子。

算子 文件 类型
Agg nodeAgg.cpp 物化算子
Append nodeAppend.cpp 控制算子
BitmapAnd nodeBitmapAnd.cpp 控制算子
BitmapHeapscan nodeBitmapHeapscan.cpp 扫描算子
BitmapIndexscan nodeBitmapIndexscan.cpp 扫描算子
BitmapOr nodeBitmapOr.cpp 控制算子
Ctescan nodeCtescan.cpp 扫描算子
Foreignscan nodeForeignscan.cpp 扫描算子
Functionscan nodeFunctionscan.cpp 扫描算子
Group nodeGroup.cpp 物化算子
Hash nodeHash.cpp 物化算子
Hashjoin nodeHashjoin.cpp 连接算子
Indexonlyscan nodeIndexonlyscan.cpp 扫描算子
Indexscan nodeIndexscan.cpp 扫描算子
Limit nodeLimit.cpp 物化算子
LockRows nodeLockRows.cpp 控制算子
Material nodeMaterial.cpp 物化算子
MergeAppend nodeMergeAppend.cpp 控制算子
Mergejoin nodeMergejoin.cpp 连接算子
ModifyTable nodeModifyTable.cpp 控制算子
Nestloop nodeNestloop.cpp 连接算子
PartIterator nodePartIterator.cpp 连接算子
Recursiveunion nodeRecursiveunion.cpp 控制算子
Result nodeResult.cpp 控制算子
Samplescan nodeSamplescan.cpp 扫描算子
Seqscan nodeSeqscan.cpp 扫描算子
SetOp nodeSetOp.cpp 物化算子
Sort nodeSort.cpp 物化算子
Stub nodeStub.cpp 控制算子
Subplan nodeSubplan.cpp 控制算子
Subqueryscan nodeSubqueryscan.cpp 扫描算子
Tidscan nodeTidscan.cpp 扫描算子
Unique nodeUnique.cpp 物化算子
Valuesscan nodeValuesscan.cpp 扫描算子
WindowAgg nodeWindowAgg.cpp 物化算子
Worktablescan nodeWorktablescan.cpp 扫描算子
Extensible nodeExtensible.cpp 用于扩展算子

1.2 PG新增算子汇总

下面列出PG(14devel)相比于openGauss多了哪些算子。

算子 文件 类型
Custom nodeCustom.c
Gather nodeGather.c
GatherMerge nodeGatherMerge.c
IncrementalSort nodeIncrementalSort.c
Namedtuplestorescan nodeNamedtuplestorescan.c
ProjectSet nodeProjectSet.c
TableFuncscan nodeTableFuncscan.c
Tidrangescan nodeTidrangescan.c

1.1表格中的算子Extensible类似于PG的算子Custom,其作用是允许插件向数据库增加新的扫描类型。主要分为三步:

首先,在路径规划期间生成插件增加的扫描路径(ExtensiblePath);

然后,如果优化器选择该路径作为最优路径,那么需要生成对应的计划(ExtensiblePlan);

最后,必须提供执行该计划的能力(ExtensiblePlanState)。

下面以TidRangeScan为示例,演示如何使用Extensible通过插件化的方式为openGauss新增一个执行算子。

2.1 功能介绍

openGauss中堆表由一个个page组成,每个page包含若干个tuple。tid是tuple的寻址地址,由两个字段组成:(pageid,itemid),pageid代表第几个数据块,itemid代表这个page内的第几条记录。例如tid=(10,1)表示第11个数据块中的第一条记录(pageid从0开始,itemid从1开始)。

PostgreSQL 14 devel新增了算子TidRangeScan,可以直接通过tid来范围访问某个page的全部数据。(带来的好处:如果需要更新一张表所有数据时,可以开启多个会话并行去更新不同的page,提高效率。)

本次展示将该特性通过插件的方式移植到openGauss,插件化的增加一个执行算子。<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值