openGauss源码解析(118)

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

4. BitmapHeapScan算子

BitmapHeapSan算子通过位图(BitmapIndexScan的输出)获取实际的元组,对应的代码源文件是“BitmapHeap.cpp”。算子对应的主要函数如表7-15所示。

表7-15 BitmapHeapScan算子主要函数

主要函数

说明

ExecInitBitmapHeapScan

初始化BitmapHeapScan状态节点

ExecBitmapHeapScan

迭代获取元组

ExecEndBitmapHeapScan

清理BitmapHeapScan状态节点

ExecReScanBitmapHeapScan

重置BitmapHeapScan

BitmapHeapScan算子对应的状态节点代码如下:

typedef struct BitmapHeapScanState {

ScanState ss; /* 节点标识 */

List* bitmapqualorig; /* 元组过滤条件 */

TIDBitmap* tbm; /* 位图:来自BitmapIndexScan节点输出 */

TBMIterator* tbmiterator; /* 位图迭代器 */

TBMIterateResult* tbmres; /* 迭代结果 */

TBMIterator* prefetch_iterator; /* 预抓取迭代器 */

int prefetch_pages; /* 预获取页面数量 */

int prefetch_target; /* 当前获取页面 */

} BitmapHeapScanState;

ExecInitBitmapHeapScan函数负责初始化BitmapHeapScan状态节点(BitmapHeapScanState)。主要执行流程如下。

(1) 创建BitmapHeapScanState状态节点。
(2) 初始化子节点,初始化目标列表、索引过滤条件、原始过滤条件。
(3) 打开对应表。
(4) 初始化元组槽位并设置元组迭代获取函数。
(5) 启动表扫描(返回表扫描描述符TableScanDesc)。
(6) 初始化左子节点(左子节点负责执行位图索引扫描,并返回位图)。

ExecBitmapHeapScan函数负责迭代输出元组。使用回调函数获取元组,依照表的类型调用BitmapHeapTblNext函数或BitmapHbucketTblNext(哈希桶类型)函数。BitmapHeapTblNext函数的主要执行流程是:首先初始化位图,然后使用位图迭代器tbmres获取元组偏移位置,最后从缓冲区获取元组slot。

ExecEndBitmapHeapScan函数负责清理BitmapHeapScan状态节点,清理流程类似于ExecEndIndexScan函数。

5. TIDScan算子

TIDScan算子用于通过遍历元组的物理存储位置获取每一个元组(TID由块编号和偏移位置组成),对应TIDScanState计划节点,相应的代码源文件是“nodeTIDScan.cpp”。算子对应的主要函数如表7-16所示。

表7-16 TIDScan算子主要函数

主要函数

说明

ExecInitTidScan

初始化TIDScan状态节点

ExecTidScan

迭代获取元组

ExecEndTidScan

清理TIDScan状态节点

ExecReScanTidScan

重置TIDScan

TID扫描算子对应的状态节点代码如下:

typedef struct TidScanState {

ScanState ss; /* 节点标识 */

List* tss_tidquals; /* tid过滤表达式 */

bool tss_isCurrentOf; /* 游标同当前扫描表是否匹配 */

Relation tss_CurrentOf_CurrentPartition; /* 当前扫描分区 */

int tss_NumTids; /* tid数量 */

int tss_TidPtr; /* 当前扫描位置 */

int tss_MarkTidPtr; /* 标记扫描位置 */

ItemPointerData* tss_TidList; /* tid列表 */

HeapTupleData tss_htup; /* 堆元组 */

HeapTupleHeaderData tss_ctbuf_hdr; /* 堆元组头信息 */

} TidScanState;

ExecInitTidScan是TIDScan节点状态初始化函数。主要执行流程如下。

(1) 创建TidScanState节点。
(2) 初始化子节点,初始化目标列表、索引过滤条件、原始过滤条件。
(3) 打开对应表。
(4) 初始化结果元组;
(5) 启动表扫描(返回表扫描描述符TableScanDesc)。

ExecTidScan是元组迭代获取函数,通过调用TidNext函数实现功能。TidNext函数首先获取Tid列表,并存放到tss_TidList数组中,根据heap_relation调用TidFetchTuple函数或HbtTidFetchTuble函数(哈希桶类型)中逐一获取元组(tss_TidPtr是tid在数组中的相对偏移位置,使用函数InitTidPtr移动偏移位置)。

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