更新时间:2024-11-05 GMT+08:00

执行计划算子

算子介绍

SQL执行计划中每一个步骤为一个数据库运算符,也叫作一个执行算子。GaussDB(DWS)中算子是基本的数据处理单元,合理地组合算子、优化算子的顺序和执行方式,可以提升数据的处理效率。

GaussDB(DWS)算子可分为:扫描算子、控制算子、物化算子、连接算子、其他算子等。

扫描算子

扫描算子用来扫描表中的数据,每次获取一条元组作为上层节点的输入, 存在于查询计划树的叶子节点,它不仅可以扫描表,还可以扫描函数的结果集、链表结构、子查询结果集。常见的扫描算子如下表所示:

表1 扫描算子

算子

含义

场景

SeqScan

顺序扫描

最基本的扫描算子,用于扫描物理表(没有索引辅助的顺序扫描)。

IndexScan

索引扫描

选择条件涉及的属性上建立了索引。

IndexOnlyScan

直接从索引返回元组

索引列完全覆盖结果集列。

BitmapScan(BitmapIndexScan, BitmapHeapScan)

利用Bitmap获取元组

BitmapIndexScan利用属性上的索引进行扫描,返回结果为一个位图;BitmapHeapScan从BitmapIndexScan输出的位图中获取元组。

TidScan

通过元组tid获取元组

  1. WHERE conditions(like CTID = tid or CTID IN (tid1, tid2, …)) ;
  2. UPDATE/DELETE … WHERE CURRENT OF cursor;

SubqueryScan

子查询扫描

以另一个查询计划树(子计划)为扫描对象进行元组的扫描。

FunctionScan

函数扫描

FROM function_name

ValuesScan

扫描values链表

对VALUES子句给出的元组集合进行扫描。

ForeignScan

外部表扫描

查询外部表。

CteScan

CTE表扫描

扫描SELECT查询中用WITH子句定义的子查询。

连接算子

连接算子对应了关系代数中的连接操作,以表 t1 join t2 为例,主要的集中连接类型如下:inner join、left join、right join、full join、semi join、 anti join,其实现方式包括Nestloop、HashJoin及MergeJoin。
表2 连接算子

算子

含义

场景

实现特点

NestLoop

嵌套循环连接,暴力连接,对每一行都扫描内表。

Inner Join, Left Outer Join, Semi Join, Anti Join

适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。

MergeJoin

归并连接(输入有序),内外表排序,定位首尾两端,一次性连接元组。等值连接。

Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join

也称作“融合连接”,是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。

因为Merge join需要做更多的排序,所以消耗的资源更多,因此通常情况下执行性能差于Hash Join。 如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时Merge Join的性能优于Hash Join。

(Sonic) HashJoin

哈希连接,内外表使用join列的hash值建立hash表,相同值的必在同一个hash桶。等值连接的连接两端必须为类型相同的等值连接,且支持hash散列。

Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join

哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。

物化算子

物化算子是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这是要用物化算子将元组缓存起来;
表3 物化算子

算子

含义

场景

Material

物化

缓存子节点结果。

Sort

排序

ORDER BY子句,连接操作,分组操作,集合操作,配合Unique。

Group

分组操作

GROUP BY子句。

Agg

执行聚集函数

  1. COUNT/SUM/AVG/MAX/MIN等聚集函数。
  2. DISTINCT子句。
  3. UNION去重。
  4. GROUP BY子句。

WindowAgg

窗口函数

WINDOW子句。

Unique

去重(下层已排序)

  1. DISTINCT子句。
  2. UNION去重。

Hash

HashJoin辅助节点

构造hash表,配合HashJoin。

SetOp

处理集合操作

INTERSECT/INTERSECT ALL,EXCEPT/EXCEPT ALL

LockRows

处理行级锁

SELECT … FOR SHARE/UPDATE

控制算子

控制算子是一类用于处理特殊情况的节点,用于实现特殊的执行流程。
表4 控制算子

算子

含义

场景

Result

直接进行计算

1. 不包含表扫描。

2. INSERT语句中只有一个VALUES子句。

ModifyTable

INSERT/UPDATE/DELETE上层节点

INSERT/UPDATE/DELETE

Append

追加

1. UNION(ALL)。

2. 继承表。

MergeAppend

追加(输入有序)

1. UNION(ALL)。

2. 继承表。

RecursiveUnion

处理WITH子句中递归定义的UNION子查询

WITH RECURSIVE … SELECT … 语句。

BitmapAnd

Bitmap逻辑与操作

多维索引扫描的BitmapScan。

BitmapOr

Bitmap逻辑或操作

多维索引扫描的BitmapScan。

Limit

处理LIMIT子句

OFFSET … LIMIT …

其他算子

其他算子包括Stream算子,以及RemoteQuery等算子。Stream算子主要有三种类型:Gather stream、Broadcast stream及Redistribute stream。

  • Gather stream:每个源节点都将其数据发送给目标节点进行汇聚。
  • Broadcast stream:由一个源节点将其数据发给N个目标节点进行运算。
  • Redistribute stream:每个源节点将其数据根据连接条件计算Hash值,根据重新计算的Hash值进行分布,发给对应的目标节点。
表5 其他算子

算子

含义

场景

Stream

多节点数据交换

执行分布式查询计划,节点间存在数据交换。

Partition Iterator

分区迭代器

分区表扫描,迭代扫描每个分区。

RowToVec

行转列

行列混合场景。

DfsScan / DfsIndexScan

HDFS表(索引)扫描

HDFS表扫描。