引言
之前的文章中,我介绍了查询执行的总体流程。接下来的几篇文章里,我将学习查询执行过程中的各个算子。
算子
在SQL executor 查询执行模型概述这篇文章中,我介绍了火山模型将查询执行树的每一个节点抽象成一个算子,每一个算子代表一类操作(选择、投影、扫描等)。算子的执行是查询执行的关键,无论哪一个算子出现问题,都会导致查询执行结果错误。
opengauss里有30多个算子,总共可以分为以下几类。
算子分类
-
扫描算子(Scan Plan Node)
扫描算子一般位于执行树的叶子结点,通过扫描操作获取表数据作为执行树PlanTree的数据输入。
扫描算子 含义 SeqScan 顺序扫描 BitmapHeapScan 利用Bitmap获取元组 BitmapIndexScan 利用Bitmap获取元组 TidScan 通过Tid获取元组 IndexScan 索引扫描 IndexOnlyScan 直接从索引返回一个元组 ForeignScan 外部表扫描 WorkTableScan 扫描中间结果集 ValuesScan 扫描values列表 SubQueryScan 子查询扫描 CteScan 扫描CommTableExpr FunctionScan 扫描函数返回结果 PartIterator 从分区迭代中获取元组 -
控制算子(Control Plan Node)
控制算子一般是执行器为了完成一些特殊的任务而引入的算子。
控制算子 含义 Result 处理单计算表达式 ModifyTable 处理插入、更新、删除 Append 集合操作 MergeAppend 集合操作 RecursiveUnion 处理Recursive查询 BitmapAnd 与位图运算 BitmapOr 或位图运算 -
物化算子(Materialize Plan Node)
物化算子用于缓存元组,供后续使用。
物化算子 含义 Material 缓存结点共后续扫描 Sort 处理排序操作 Group 处理有序数据的分组操作 Agg 处理无序数据的分组操作 Unique 去重操作 Hash hash缓存 SetOp 缓存,用于处理集合 WindowAgg 处理窗口函数 LockRows 处理行级锁 Limit 限制返回元组数量
-
连接算子(Join Plan Node)
连接算子用于对表进行连接,包括内连接与外连接等。
连接算子 含义 Nestloop 循环嵌套连接 MergeJoin 归并连接 HashJoin 哈希连接
小结
本篇文章中,我根据算子的不同用途将opengauss中大部分算子分门归类,总共分成四类:扫描算子、控制算子、物化算子、连接算子。接下来的文章中,我将具体地解析这些算子。