执行计划节点类型
最近更新时间: 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可以完全下推到数据节点 |