UNION 算子用于将两个查询的结果集进行并集运算。

OceanBase 数据库支持的 UNION 算子包括 UNION ALL、 HASH UNION DISTINCT 和 MERGE UNION DISTINCT。

UNION ALL

UNION ALL 用于直接对两个查询结果集进行合并输出。

如下示例中,Q1 对两个查询使用 UNION ALL 进行联接,使用 UNION ALL 算子进行并集运算。算子执行时依次输出左右子节点所有输出结果。

  1. obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
  2. Query OK, 0 rows affected (0.12 sec)
  3. obclient>INSERT INTO t1 VALUES(1,1);
  4. Query OK, 1 rows affected (0.12 sec)
  5. obclient>INSERT INTO t1 VALUES(2,2);
  6. Query OK, 1 rows affected (0.12 sec)
  7. Q1:
  8. obclient>EXPLAIN SELECT c1 FROM t1 UNION ALL SELECT c2 FROM t1\G;
  9. *************************** 1. row ***************************
  10. Query Plan:
  11. ====================================
  12. |ID|OPERATOR |NAME|EST. ROWS|COST|
  13. ------------------------------------
  14. |0 |UNION ALL | |4 |74 |
  15. |1 | TABLE SCAN|T1 |2 |37 |
  16. |2 | TABLE SCAN|T1 |2 |37 |
  17. ====================================
  18. Outputs & filters:
  19. -------------------------------------
  20. 0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
  21. 1 - output([T1.C1]), filter(nil),
  22. access([T1.C1]), partitions(p0)
  23. 2 - output([T1.C2]), filter(nil),
  24. access([T1.C2]), partitions(p0)

上述示例中,执行计划展示中的 outputs & filters 详细列出了 UNION ALL 算子的输出信息如下:

信息名称

含义

output

该算子的输出表达式。

filter

该算子上的过滤条件。

由于示例中 UNION ALL 算子没有设置 filter,所以为 nil。

MERGE UNION DISTINCT

MERGE UNION DISTINCT 用于对结果集进行并集、去重后进行输出。

如下示例中,Q2 对两个查询使用 UNION DISTINCT 进行联接, c1 有可用排序,0 号算子生成 MERGE UNION DISTINCT 进行取并集、去重。由于 c2 无可用排序,所以在 3 号算子上分配了 SORT 算子进行排序。算子执行时从左右子节点读取有序输入,进行合并得到有序输出并去重。

  1. Q2:
  2. obclient>EXPLAIN SELECT c1 FROM t1 UNION SELECT c2 FROM t1\G;
  3. *************************** 1. row ***************************
  4. Query Plan:
  5. =============================================
  6. |ID|OPERATOR |NAME|EST. ROWS|COST|
  7. ---------------------------------------------
  8. |0 |MERGE UNION DISTINCT| |4 |77 |
  9. |1 | TABLE SCAN |T1 |2 |37 |
  10. |2 | SORT | |2 |39 |
  11. |3 | TABLE SCAN |T1 |2 |37 |
  12. =============================================
  13. Outputs & filters:
  14. -------------------------------------
  15. 0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
  16. 1 - output([T1.C1]), filter(nil),
  17. access([T1.C1]), partitions(p0)
  18. 2 - output([T1.C2]), filter(nil), sort_keys([T1.C2, ASC])
  19. 3 - output([T1.C2]), filter(nil),
  20. access([T1.C2]), partitions(p0)

上述示例的执行计划展示中的 outputs & filters 详细列出了 MERGE UNION DISTINCT 算子的输出信息,字段的含义与 UNION ALL 算子相同。

HASH UNION DISTINCT

HASH UNION DISTINCT 用于对结果集进行并集、去重后进行输出。

如下示例中,Q3 对两个查询使用 UNION DISTINCT 进行联接,无可利用排序,0 号算子使用 HASH UNION DISTINCT 进行并集、去重。算子执行时读取左右子节点输出,建立哈希表进行去重,最终输出去重后结果。

  1. Q3:
  2. obclient>EXPLAIN SELECT c2 FROM t1 UNION SELECT c2 FROM t1\G;
  3. *************************** 1. row ***************************
  4. Query Plan:
  5. ============================================
  6. |ID|OPERATOR |NAME|EST. ROWS|COST|
  7. --------------------------------------------
  8. |0 |HASH UNION DISTINCT| |4 |77 |
  9. |1 | TABLE SCAN |T1 |2 |37 |
  10. |2 | TABLE SCAN |T1 |2 |37 |
  11. ============================================
  12. Outputs & filters:
  13. -------------------------------------
  14. 0 - output([UNION(T1.C2, T1.C2)]), filter(nil)
  15. 1 - output([T1.C2]), filter(nil),
  16. access([T1.C2]), partitions(p0)
  17. 2 - output([T1.C2]), filter(nil),
  18. access([T1.C2]), partitions(p0)

上述示例的执行计划展示中的 outputs & filters 详细列出了 HASH UNION DISTINCT 算子的输出信息,字段的含义与 UNION ALL 算子相同。