OceanBase UNION

2021-06-29 17:59 更新

UNION 算子用于將兩個查詢的結(jié)果集進(jìn)行并集運(yùn)算。

OceanBase 數(shù)據(jù)庫支持的 UNION 算子包括 UNION ALL、 HASH UNION DISTINCT 和 MERGE UNION DISTINCT。

UNION ALL

UNION ALL 用于直接對兩個查詢結(jié)果集進(jìn)行合并輸出。

如下示例中,Q1 對兩個查詢使用 UNION ALL 進(jìn)行聯(lián)接,使用 UNION ALL 算子進(jìn)行并集運(yùn)算。算子執(zhí)行時依次輸出左右子節(jié)點(diǎn)所有輸出結(jié)果。

obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(1,1);
Query OK, 1 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(2,2);
Query OK, 1 rows affected (0.12 sec)

Q1: 
obclient>EXPLAIN SELECT c1 FROM t1 UNION ALL SELECT c2 FROM t1\G;
*************************** 1. row ***************************
Query Plan:
====================================
|ID|OPERATOR   |NAME|EST. ROWS|COST|
------------------------------------
|0 |UNION ALL  |    |4        |74  |
|1 | TABLE SCAN|T1  |2        |37  |
|2 | TABLE SCAN|T1  |2        |37  |
====================================
Outputs & filters: 
-------------------------------------
  0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
  1 - output([T1.C1]), filter(nil), 
      access([T1.C1]), partitions(p0)
  2 - output([T1.C2]), filter(nil), 
      access([T1.C2]), partitions(p0)

上述示例中,執(zhí)行計劃展示中的 outputs & filters 詳細(xì)列出了 UNION ALL 算子的輸出信息如下:

信息名稱

含義

output

該算子的輸出表達(dá)式。

filter

該算子上的過濾條件。

由于示例中 UNION ALL 算子沒有設(shè)置 filter,所以為 nil。

MERGE UNION DISTINCT

MERGE UNION DISTINCT 用于對結(jié)果集進(jìn)行并集、去重后進(jìn)行輸出。

如下示例中,Q2 對兩個查詢使用 UNION DISTINCT 進(jìn)行聯(lián)接, c1 有可用排序,0 號算子生成 MERGE UNION DISTINCT 進(jìn)行取并集、去重。由于 c2 無可用排序,所以在 3 號算子上分配了 SORT 算子進(jìn)行排序。算子執(zhí)行時從左右子節(jié)點(diǎn)讀取有序輸入,進(jìn)行合并得到有序輸出并去重。

Q2: 
obclient>EXPLAIN SELECT c1 FROM t1 UNION SELECT c2 FROM t1\G;
*************************** 1. row ***************************
Query Plan:
=============================================
|ID|OPERATOR            |NAME|EST. ROWS|COST|
---------------------------------------------
|0 |MERGE UNION DISTINCT|    |4        |77  |
|1 | TABLE SCAN         |T1  |2        |37  |
|2 | SORT               |    |2        |39  |
|3 |  TABLE SCAN        |T1  |2        |37  |
=============================================
Outputs & filters: 
-------------------------------------
  0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
  1 - output([T1.C1]), filter(nil), 
      access([T1.C1]), partitions(p0)
  2 - output([T1.C2]), filter(nil), sort_keys([T1.C2, ASC])
  3 - output([T1.C2]), filter(nil), 
      access([T1.C2]), partitions(p0)

上述示例的執(zhí)行計劃展示中的 outputs & filters 詳細(xì)列出了 MERGE UNION DISTINCT 算子的輸出信息,字段的含義與 UNION ALL 算子相同。

HASH UNION DISTINCT

HASH UNION DISTINCT 用于對結(jié)果集進(jìn)行并集、去重后進(jìn)行輸出。

如下示例中,Q3 對兩個查詢使用 UNION DISTINCT 進(jìn)行聯(lián)接,無可利用排序,0 號算子使用 HASH UNION DISTINCT 進(jìn)行并集、去重。算子執(zhí)行時讀取左右子節(jié)點(diǎn)輸出,建立哈希表進(jìn)行去重,最終輸出去重后結(jié)果。

Q3: 
obclient>EXPLAIN SELECT c2 FROM t1 UNION SELECT c2 FROM t1\G;
*************************** 1. row ***************************
Query Plan:
============================================
|ID|OPERATOR           |NAME|EST. ROWS|COST|
--------------------------------------------
|0 |HASH UNION DISTINCT|    |4        |77  |
|1 | TABLE SCAN        |T1  |2        |37  |
|2 | TABLE SCAN        |T1  |2        |37  |
============================================
Outputs & filters: 
-------------------------------------
  0 - output([UNION(T1.C2, T1.C2)]), filter(nil)
  1 - output([T1.C2]), filter(nil), 
      access([T1.C2]), partitions(p0)
  2 - output([T1.C2]), filter(nil), 
      access([T1.C2]), partitions(p0)

上述示例的執(zhí)行計劃展示中的 outputs & filters 詳細(xì)列出了 HASH UNION DISTINCT 算子的輸出信息,字段的含義與 UNION ALL 算子相同。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號