执行计划算子
算子介绍
SQL执行计划中每一个步骤为一个数据库运算符,也叫做一个执行算子。DataArts Fabric SQL中算子是基本的数据处理单元,合理地组合算子、优化算子的顺序和执行方式,可以提升数据的处理效率。
DataArts Fabric SQL算子可分为:扫描算子、控制算子、物化算子、连接算子、其他算子等。
扫描算子
扫描算子用来扫描表中的数据,每次获取一条元组作为上层节点的输入, 存在于查询计划树的叶子节点,它不仅可以扫描表,还可以扫描函数的结果集、链表结构、子查询结果集。常见的扫描算子如下表所示:
| 算子 | 含义 | 场景 |
|---|---|---|
| VecForeignScan | 顺序扫描 | 最基本的扫描算子,用于扫描外表。 |
| VecSubqueryScan | 子查询扫描 | 以另一个查询计划树(子计划)为扫描对象进行元组的扫描。 |
| FunctionScan | 函数扫描 | FROM function_name |
| ValuesScan | 扫描values链表 | 对VALUES子句给出的元组集合进行扫描。 |
连接算子
| 算子 | 含义 | 场景 | 实现特点 |
|---|---|---|---|
| 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表结构不同,不影响执行的结果集。 |
物化算子
| 算子 | 含义 | 场景 |
|---|---|---|
| VecMaterial | 物化 | 缓存子节点结果。 |
| VecSort | 排序 | ORDER BY子句,连接操作,分组操作,集合操作,配合Unique。 |
| VecAgg | 执行聚集函数 |
|
| VecWindowAgg | 窗口函数 | WINDOW子句。 |
| VecSetOp | 处理集合操作 | INTERSECT/INTERSECT ALL,EXCEPT/EXCEPT ALL |
控制算子
| 算子 | 含义 | 场景 |
|---|---|---|
| VecResult | 直接进行计算 |
|
| VecModifyTable | INSERT/UPDATE/DELETE上层节点 | INSERT/UPDATE/DELETE |
| VecAppend | 追加 |
|
| VecLimit | 处理LIMIT子句 | OFFSET … LIMIT … |
其他算子
其他算子包括VecStream算子,以及RemoteQuery等算子。Stream算子主要有三种类型:Gather stream、Broadcast stream及Redistribute stream。
- Gather stream:每个源节点都将其数据发送给目标节点进行汇聚。
- Broadcast stream:由一个源节点将其数据发给N个目标节点进行运算。
- Redistribute stream:每个源节点将其数据根据连接条件计算Hash值,根据重新计算的Hash值进行分布,发给对应的目标节点。
| 算子 | 含义 | 场景 |
|---|---|---|
| VecStream | 多节点数据交换 | 执行分布式查询计划,节点间存在数据交换。 |
| RowToVec | 行转列 | 行列混合场景。 |