
# 执行计划算子
#### 算子介绍
SQL执行计划中每一个步骤为一个数据库运算符，也叫做一个执行算子。DataArts Fabric SQL中算子是基本的数据处理单元，合理地组合算子、优化算子的顺序和执行方式，可以提升数据的处理效率。
DataArts Fabric SQL算子可分为：扫描算子、控制算子、物化算子、连接算子、其他算子等。
#### 扫描算子
扫描算子用来扫描表中的数据，每次获取一条元组作为上层节点的输入， 存在于查询计划树的叶子节点，它不仅可以扫描表，还可以扫描函数的结果集、链表结构、子查询结果集。常见的扫描算子如下表所示：
表1扫描算子 
| 算子              | 含义         | 场景                          |
|:---|:---|:---|
| VecForeignScan  | 顺序扫描       | 最基本的扫描算子，用于扫描外表。            |
| VecSubqueryScan | 子查询扫描      | 以另一个查询计划树（子计划）为扫描对象进行元组的扫描。 |
| FunctionScan    | 函数扫描       | FROM function_name          |
| ValuesScan      | 扫描values链表 | 对VALUES子句给出的元组集合进行扫描。       |
   
#### 连接算子
连接算子对应了关系代数中的连接操作，以表t1 join t2为例，主要的集中连接类型如下：inner join、left join、right join、full join、semi join、 anti join，其实现方式包括Nestloop、HashJoin及MergeJoin。
表2连接算子 
| 算子                    | 含义                                                                           | 场景                                                                                   | 实现特点                                                                                                                          |
|:---|:---|:---|:---|
| VecNestLoop           | 嵌套循环连接，暴力连接，对每一行都扫描内表。                                                       | Inner Join, Left Outer Join, Semi Join, Anti Join                                    | 适用于被连接的数据子集较小的查询。在嵌套循环中，外表驱动内表，外表返回的每一行都要在内表中检索找到它匹配的行，因此整个查询返回的结果集不能太大（不能大于10000），要把返回子集较小的表作为外表，而且在内表的连接字段上建议要有索引。          |
| Vector 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物化算子 
| 算子           | 含义     | 场景                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
|:---|:---|:---|
| VecMaterial  | 物化     | 缓存子节点结果。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| VecSort      | 排序     | ORDER BY子句，连接操作，分组操作，集合操作，配合Unique。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| VecAgg       | 执行聚集函数 | 1. COUNT/SUM/AVG/MAX/MIN等聚集函数。  2. DISTINCT子句。  3. UNION去重。  4. GROUP BY子句。   |
| VecWindowAgg | 窗口函数   | WINDOW子句。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| VecSetOp     | 处理集合操作 | INTERSECT/INTERSECT ALL，EXCEPT/EXCEPT ALL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
#### 控制算子
控制算子是一类用于处理特殊情况的节点，用于实现特殊的执行流程。
表4控制算子 
| 算子             | 含义                       | 场景                                                                                                                                                                                                                                                                                                                                                                                                                              |
|:---|:---|:---|
| VecResult      | 直接进行计算                   | 1. 不包含表扫描。  2. INSERT语句中只有一个VALUES子句。   |
| VecModifyTable | INSERT/UPDATE/DELETE上层节点 | INSERT/UPDATE/DELETE                                                                                                                                                                                                                                                                                                                                                                                                            |
| VecAppend      | 追加                       | 1. UNION(ALL)。  2. 继承表。                    |
| VecLimit       | 处理LIMIT子句                | OFFSET ... LIMIT ...                                                                                                                                                                                                                                                                                                                                                                                                            |
   
#### 其他算子
其他算子包括VecStream算子，以及RemoteQuery等算子。Stream算子主要有三种类型：Gather stream、Broadcast stream及Redistribute stream。
- Gather stream：每个源节点都将其数据发送给目标节点进行汇聚。
- Broadcast stream：由一个源节点将其数据发给N个目标节点进行运算。
- Redistribute stream：每个源节点将其数据根据连接条件计算Hash值，根据重新计算的Hash值进行分布，发给对应的目标节点。
表5其他算子 
| 算子        | 含义      | 场景                   |
|:---|:---|:---|
| VecStream | 多节点数据交换 | 执行分布式查询计划，节点间存在数据交换。 |
| RowToVec  | 行转列     | 行列混合场景。              |
   
