openGauss源码解析(116)

openGauss源码解析:执行器解析(9)

7.3.2 扫描算子

扫描算子用于表、结果集、链表子查询等结果遍历,每次获取一条元组作为上层节点的输入。控制算子中的BitmapAnd/BitmapOr函数所需的位图与扫描算子(索引扫描算子)密切相关。主要包括顺序扫描(SeqScan)、索引扫描(IndexScan)、位图扫描(BitmapHeapScan)、位图索引扫描(BitmapIndexScan)、元组TID扫描(TIDScan)、子查询扫描(SubqueryScan)、函数扫描(FunctionScan)等。扫描算子如表7-11所示。

表7-11 扫描算子

算子名称

说明

SeqScan算子

用于扫描基础表

IndexScan算子

对表的扫描使用索引加速元组获取

BitmapIndexScan算子

通过位图索引做扫描操作

TIDScan算子

遍历元组的物理存储位置获取一个元组

SubqueryScan算子

子查询生成的子执行计划

FunctionScan算子

用于从函数返回的数据集中获取元组

ValuesScan算子

用于处理“Values (…),(…), …”类型语句,从值列表中输出元组

CteScan算子

用于处理With表达式对应的子查询

WorkTableScan算子

用于递归工作表元组输出

PartIterator算子

用于支持分区表的wise join

IndexOnlyScan算子

如索引的键值满足了查询中所有表达式的需求,可以通过只对索引扫描获得元组,避免对堆表(Heap)的访问

ForeignScan算子

扫描外部数据表

1. SeqScan算子

SeqScan算子是最基本的扫描算子,对应SeqScan执行节点,对应的代码源文件是“nodeSeqScan.cpp”,用于对基础表做顺序扫描。算子对应的主要函数如表7-12所示。

表7-12 SeqScan算子主要函数

主要函数

说明

ExecInitSeqScan

初始化SeqScan状态节点

ExecSeqScan

迭代获取元组

ExecEndSeqScan

清理SeqScan状态节点

ExecSeqMarkPos

标记扫描位置

ExecSeqRestrPos

重置扫描位置

ExecReScanSeqScan

重置SeqScan

InitScanRelation

初始化扫描表

ExecInitSeqScan函数初始化SeqScan状态节点,负责节点状态结构构造,并初始化用于存储结果的元组表。

ExecSeqScan函数是SeqScan算子执行的主体函数,用于迭代获取每一个元组。ExecSeqScan函数通过回调函数调用SeqNext函数、HbktSeqSampleNext函数、SeqSampleNext函数实现获取元组。非采样获取元组时调用SeqNext函数;如果需要采样且对应的表采用哈希桶方式存储则调用HbktSeqSampleNext函数,否则调用SeqSampleNext函数。

posted @ 2024-04-30 10:35  openGauss-bot  阅读(14)  评论(0)    收藏  举报