执行计划节点类型

最近更新时间: 2024-10-17 17:10:00

执行计划节点分为扫描算子、控制算子、物化算子、链接算子等。

扫描算子

扫描节点负责从底层数据来源抽取数据,数据来源可能是来自文件系统,也可能来自网络(分布式查询)。一般而言扫描节点都位于执行树的叶子节点,作为执行树PlanTree的数据输入来源。

关键特征:输入数据、叶子节点、表达式过滤

算子类型 EXPLAIN 显示 含义 出现场景描述
SeqScan Seq Scan 顺序扫描行存数据 用于扫描行存物理表(没有索引辅助的情况下)
EstoreSeqScan Estore Seq Scan 扫描列存数据 基础的列存引擎扫描算子, 用于扫描列存物理表(没有索引的情况下)
VtsCacheSeqScan VtsCache Seq Scan 向量化计算缓存结果集扫描 列存引擎下向量化计算缓存
BitmapIndexScan
BitmapHeapScan
Bitmap Index Scan
Bitmap Heap Scan
利用Bitmap获取元组 BitmapIndexScan 一次性将满足条件的索引项全部取出,然后交给bitmapHeapScan节点,并在内存中进行排序, 根据取出的索引项访问表数据。
TidScan Tid Scan 通过Tid获取元组 通过对表的ctid字段进行过滤和查找
SampleScan Sample Scan 数据抽样 用于数据抽样, SELECT … FROM table_name TABLESAMPLE sampling_method
IndexScan Index Scan 索引扫描 利用索引进行快速定位符合查询条件的元组
IndexOnlyScan Index Only Scan 直接从索引返回元组 与IndexScan的差别是无需再次访问基表
SubqueryScan Subquery Scan 子查询扫描 已一个子查询的结果集作为当前的输入
FunctionScan Function Scan 函数扫描 将函数的结果集看成一个结果集, 进行后续的计算, 比如 FROM function_name
ValuesScan Values Scan 扫描Values列表 对 values()子句的元组集合进行扫描
TableFuncScan Table Function Scan 处理TableFunc相关的扫描 xml table/函数
CteScan CTE Scan 扫描Common Table Expression 将CTE的输出看成一个集合,进行后续的关系运算, 比如 with子语句定义的CTE子查询
NamedTuplestoreScan Named Tuplestore Scan 用于某些命名的结果集的扫描
WorkTableScan Worktable Scan 扫描中间结果集 扫描查询过程中spillout的结果集
ForeignScan Foreign Scan 外部表扫描 扫描基于外部数据源的外部表(FDW)
CustomScan Custom Scan 自定义扫描

控制算子

控制算子一般不映射代数运算符,通常是为了执行器完成一些特殊的流程引入的算子。

关键特征:用于控制数据流程。

算子类型 EXPLAIN 显示 含义 出现场景描述
Result Row Result 行存储结果 处理仅需要一次计算的条件表达式或insert中的value子句
VecResult Vector Result 列存储结果 向量化结果
ModifyTable 取决于具体的操作,可能的显示
- Insert
- Update
- Delete
Insert/Update/Delete操作的算子 增,删, 改
Append Append 多个关系集合的追加操作 UNION, UNION-ALL
MergeAppend Merge Append 多个有序关系集合的追加操作 UNION, 继承表
RecursiveUnion Recursive Union 执行recursive subquery with recursive递归子查询
Limit Limit 控制数据流的返回数据量 处理带limit的语句

物化算子

物化算子一般指算法要求,在做算子逻辑处理的时候,要求把下层的数据进行缓存处理,因为对于下层算子返回的数据量不可提前预知,因此需要在算法上考虑数据无法全部放置到内存的情况。

关键特征:需要扫描所有数据之后才返回。

算子类型 EXPLAIN 显示 含义 使用场景
Materialzie Materialize 物化 缓存结果集以方便后续重复扫描
Sort Sort 对下层数据进行排序 Order By, MergeJoin, SortAgg, MergeAppend, 配合Unique去重等
Group Group 对下层已经排序的数据进行分组 处理group-by分组操作
Agg 取决于优化器选择的聚合策略, 有多种可能的显示-
- Aggregate
- GroupAggregate
- HashAggregate
- MixedAggregate
对下层数据进行分组或者聚合;可操作有序或无序数据 count/sum/avg/max/min等聚合函数; distinct子句,union去重, group-by子句
Unique Unique 对下层数据进行去重操作 Distinct. union去重
Hash Hash 对下层数据进行缓存,存储到一个哈希表里 作为HashJoin算子的输入, 构造HashTable
SetOp 取决于优化器选择的策略, 有多种可能的显示-
- SetOp
- HashSetOp
对下层数据进行缓存,用于处理集合操作
intersect/intersect-all, except/except-all 等操作
WindowAgg WindowAgg 窗口函数 包含窗口函数的语句
LockRows LockRows 处理行级锁 SELECT..FOR SHARE/UPDATE

链接算子

这类算子是为了应对数据库中最常见的关联操作。

算子类型 EXPLAIN 显示 含义 场景描述
Nestloop Nested Loop 循环嵌套链接操作 Inner, Left-outer, Semi-Join, Anti-Join
MergeJoin Merge Join 归并链接操作 Inner, left-outer, right-outer, full-outer, semi-join, anti-join
HashJoin Hash Join 哈希链接操作 Inner, left-outer, right-outer, full-outer, semi-join, anti-join

分布式特有的算子

还有一些分布式架构下特有的算子类型

算子类型 EXPLAIN 显示 含义 场景描述
RemoteSubPlan Remote Subquery Scan 数据重分布 分布式下需要数据重分布情况
RemoteQuery Remote Fast Query Execution SQL下推算子 分布式下SQL可以完全下推到数据节点