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函数。

浙公网安备 33010602011771号