执行计划节点类型

最近更新时间: 2025-10-11 18:10:00

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

扫描算子

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

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

控制算子

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

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

物化算子

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

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

链接算子

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

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

分布式特有的算子

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

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