
# 执行计划算子
#### 算子介绍
SQL执行计划中每一个步骤为一个数据库运算符，也叫作一个执行算子。DWS中算子是基本的数据处理单元，合理地组合算子、优化算子的顺序和执行方式，可以提升数据的处理效率。
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       | 执行聚集函数。包含三种类型： - HashAggregate，哈希聚集算子，适用于大部分场景，以及数据无序情况下的聚集计算。  - GroupAggregate，排序聚集算子，基于排序或已排序输入做分组聚合。  - Aggregate，普通聚合算子，不分组，只简单聚集。   | 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表扫描。             |
   
