#执行算子
# 数据查询算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| SUBQUERY | 子查询标识,表示存在行子查询执行计划,列子查询会转为result计划。 | √ | √ |
| VIEW | 视图标识,当行表同层查询存在from子查询或者用户视图时需要增加。 | √ | × |
| CONNECT BY | 层次递归查询,对于某一条记录,以深度优先返回与当前记录通过connect by条件关联的所有记录,且返回的记录集是依据prior id=father_id形成的一个包含当前的记录和以当前记录id为根节点的树状结构数据。 | √ | × |
| SELECT STATEMENT | 查询语句标识。 | √ | √ |
| INSERT STATEMENT | 插入语句标识 | √ | √ |
| UPDATE STATEMENT | 数据更新语句标识。 | √ | √ |
| DELETE STATEMENT | 数据删除语句标识。 | √ | √ |
| MERGE STATEMENT | 数据批量插入语句标识,满足条件时插入语句,在一次全表扫描中可以完成所有INSERT。 | √ | √ |
| UNION ALL | 将多个SELECT的结果集合并返回。 | √ | √ |
| AGGREGATE | 对未分组的数据执行聚集操作。 | √ | √ |
| FOR UPDATE | 查询某行数据的同时加行级锁,防止其他用户更新此条数据。 | √ | √ |
| RESULT | 谓词重组后,计划树上需要承载FILTER和投影的独立计划节点。 | √ | √ |
| WINDOW | limit数据筛选。用于限定结果集返回行数,具有略过offset的能力。 | √ | √ |
| WINDOW SORT | 窗口函数标识,可以同时进行分组和排序,基于排序做分组,且会返回原始信息而非分组后(一组只有一条)的信息。 | √ | √ |
| WINDOW HASH | 窗口函数标识,可以同时进行分组和排序,基于哈希做分组,且会返回原始信息而非分组后(一组只有一条)的信息。 | × | √ |
| WINDOW NOSORT | 窗口函数标识,该算子对有序数据进行分组并计算窗口函数返回值,且会返回原始信息而非分组后(一组只有一条)的信息。如果下层算子提供的数据顺序已经满足窗口函数所需的排序要求,则可以选用该算子。 | √ | √ |
| FIRST ROW | 获取下层扫描算子得到的第一行记录。 | √ | √ |
| COUNT | 返回表中选取的行数。 | √ | √ |
| COUNT STOPKEY | 使用ROWNUM作为限定条件返回表中选取的行数。 | √ | √ |
# 表扫描算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| TABLE ACCESS FULL | 全表扫描。 | √ | √ |
| TABLE ACCESS BY INDEX ROWID | 根据索引查找到对应数据的block的rowid(根据rowid回表)。 | √ | √ |
| TABLE ACCESS BY USER ROWID | 指定rowid进行数据block的查找。 | √ | √ |
# 索引扫描算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| INDEX UNIQUE SCAN | 唯一索引扫描,仅适用于where条件是等值查询的SQL。 | √ | √ |
| INDEX RANGE SCAN | 索引范围扫描。当扫描对象是唯一索引时,谓词条件必须是范围查询(between、<、>);扫描对象是非唯一性索引时,没有限制。索引范围扫描可能返回多条记录。 | √ | √ |
| INDEX RANGE SCAN DESCENDING | 按降序方式进行索引范围扫描。 | √ | √ |
| INDEX FULL SCAN | 索引全扫描,扫描目标索引所有叶子块的所有索引行。 | √ | √ |
| INDEX FULL SCAN DESCENDING | 按降序方式进行索引全扫描。 | √ | √ |
| INDEX FAST FULL SCAN | 索引快速全扫描,类似于索引全扫描,但扫描结果不是有序的。因为是物理读,不是逻辑读索引,同时可以并行读索引。 | √ | √ |
| INDEX FULL SCAN (MIN/MAX) | 索引全扫描取最小/最大。不分组情形下,针对索引字段的min、max函数优化,只返回一条记录。 | √ | √ |
| INDEX RANGE SCAN (MIN/MAX) | 索引范围扫描取最小/最大。不分组情形下,针对索引字段的min、max函数优化,只返回一条记录。 | √ | √ |
| INDEX SKIP SCAN | 索引跳跃扫描,跳过索引的前导列,使用索引的非前导列进行索引扫描。 | √ | √ |
| SPATIAL INDEX SCAN | RTREE索引扫描,仅适用于索引字段的ST_Contains、ST_Intersects等空间关系函数的优化。 | √ | × |
| BITMAP OR | 索引扫描使用位图的方式进行集合表示。 | √ | × |
# 分区扫描算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| PART SCAN ITERATOR | 一组分区扫描。 | √ | √ |
| PART SCAN ALL | 所有分区扫描。 | √ | √ |
| PART SCAN SINGLE | 单个分区扫描。 | √ | √ |
| PART SCAN COMBINED ITERATOR | 指定二级分区扫描。 | √ | √ |
# AC扫描算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| AC SCAN | AC扫描。 | × | √ |
| EXPAND | 展开AC扫描的数据。 | × | √ |
# 分组/排序算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| SORT | 据实际情况生成的排序计划。 | √ | × |
| ORDER BY STOPKEY | 据实际情况生成前TOP个数据的排序计划。 | √ | √ |
| SORT ORDER BY | order by语句产生的排序计划。 | √ | √ |
| HASH DISTINCT | 使用hash算法对数据进行去重。 | √ | √ |
| SORT DISTINCT | 使用排序算法对数据进行去重。 | √ | √ |
| SORTED DISTINCT | 使用排序算法对已排序的数据进行去重。 | √ | √ |
| SORT DISTINCT STOPKEY | 使用排序算法对已排序的数据进行去重,并返回前TOP个。 | √ | √ |
| HASH GROUP | 使用hash算法对数据进行分组。 | √ | √ |
| SORT GROUP | 使用排序算法对数据进行分组。 | √ | × |
| SORT GROUP BY STOPKEY | 使用排序算法对数据进行分组,并返回前TOP个。 | √ | × |
| GROUP | 对已排好序或分组的数据进行分组。 | √ | √ |
| SORT GROUPING SETS | 使用排序算法,按照多个列进行分组,并对结果进行union操作。 | × | √ |
| HASH GROUPING SETS | 使用hash算法,按照多个列进行分组,并对结果进行union操作。 | × | √ |
# HASH JOIN算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| HASH JOIN OUTER | HASH JOIN左外连接。以左表为准,当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空返回。 | √ | √ |
| HASH JOIN FULL OUTER | HASH JOIN全外连接。当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空、左表补空+右表数据返回。 | √ | √ |
| HASH JOIN SEMI | HASH JOIN左半连接。如果左表中满足指定条件的某行数据在右表中出现过,则此行保留在结果集中。Filter in / exists常改造成SEMI JOIN。 | √ | √ |
| HASH JOIN ANTI | HASH JOIN左反半连接。如果左表中满足指定条件的某行数据没有在右表中出现过,则此行数据保留在结果集中。Filter not in / not exists常改造成ANTI JOIN。 | √ | √ |
| HASH JOIN | HASH JOIN内连接。将左表物化,右表通过HASH算法从左表查找满足join条件的数据。仅支持等值查询。 | √ | √ |
| HASH RIGHT OUTER | HASH JOIN右外连接。以右表为准,当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将右表数据+左表补空返回。 | √ | √ |
| HASH RIGHT SEMI | HASH JOIN右半连接。如果右表中满足指定条件的某行数据在左表中出现过,则此行保留在结果集中。 | √ | √ |
| HASH RIGHT ANTI | HASH JOIN右反半连接。如果右表中满足指定条件的某行数据没有在左表中出现过,则此行数据保留在结果集中。 | √ | √ |
# MERGE JOIN算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| MERGE SORT | MERGE JOIN的子PLAN,用于参与MERGE JOIN的KEY排序。 | √ | √ |
| MERGE JOIN OUTER | MERGE JOIN左外连接。支持等值、大于、大于等于、小于、小于等于作为JOIN条件进行排序。当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空返回。 | √ | √ |
| MERGE JOIN FULL OUTER | MERGE JOIN全外连接。支持等值、大于、大于等于、小于、小于等于作为JOIN条件进行排序。当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空、左表补空+右表数据返回。 | √ | √ |
| MERGE JOIN SEMI | MERGE JOIN左半连接。如果左表中满足指定条件的某行数据在右表中出现过,则此行保留在结果集中。Filter in / exists常改造成SEMI JOIN。 | √ | √ |
| MERGE JOIN ANTI | MERGE JOIN左反半连接。如果左表中满足指定条件的某行数据没有在右表中出现过,则此行数据保留在结果集中。Filter not in / not exists常改造成ANTI JOIN。 | √ | √ |
| MERGE JOIN | MERGE JOIN内连接。先将左右表进行排序物化,然后通过JOIN条件的进行merge排序,可以支持等值、大于、大于等于、小于、小于等于的排序。 | √ | √ |
# NEST LOOP算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| NEST LOOPS OUTER | NEST LOOP JOIN左外连接。以左表为准,当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空返回。 | √ | √ |
| NEST LOOPS FULL OUTER | NEST LOOP JOIN全外连接。当左右表满足join指定条件则同时返回左右表数据,如果满足不了,则将左表数据+右表补空、左表补空+右表数据返回。 | √ | √ |
| NEST LOOPS SEMI | NEST LOOP JOIN左半连接。如果左表中满足指定条件的某行数据在右表中出现过,则此行保留在结果集中。Filter in / exists常改造成SEMI JOIN。 | √ | √ |
| NEST LOOPS ANTI | NEST LOOP JOIN左反半连接。如果左表中满足指定条件的某行数据没有在右表中出现过,则此行保留在结果集中。Filter not in / not exists常改造成ANTI JOIN。 | √ | √ |
| NEST LOOPS | NEST LOOP 内连接。两表通过循环遍历方式查找满足join条件的数据。 | √ | √ |
# 辅助功能算子
| 算子名称 | 含义 | 适用行模式 | 适用列模式 |
|---|---|---|---|
| LOAD TABLE CONVENTIONAL | 在刚才插入数据时,数据库执行了实时统计值收集的动作。 | √ | √ |
| PX COORDINATOR | 单机部署中并行执行的标识,表示此标识以下的算子都为并行执行。 | √ | √ |
| DISTRIBUTED COORDINATOR | 分布式部署中并行执行的标识,表示此标识以下的算子都为并行执行。 | √ | √ |
| PX REMOTE | 表示数据交互包含跨节点的收发。 | √ | √ |
| PX LOCAL | 表示数据交互仅在本地收发。 | √ | √ |
| MERGE | 数据合并,将多路有序的数据源进行归并成一路数据的算子。 | √ | √ |
| ROW TO COL | 行计算转为列计算。 | √ | √ |
| COL TO ROW | 列计算转为行计算。 | √ | √ |
| MATERIAL | 将输入的数据源物化。 | √ | √ |

