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,插件化的增加一个执行算子。<