UNION 演算子は、2つのクエリの結果セットを和集合演算によって結合するために使用されます。
OceanBaseデータベースがサポートする UNION 演算子には、UNION ALL、HASH UNION DISTINCT、および MERGE UNION DISTINCT が含まれます。
UNION ALL
UNION ALLは、2つのクエリ結果セットを直接結合して出力するために使用されます。
以下の例では、Q1は2つのクエリに対してUNION ALLを使用して結合し、UNION ALL演算子を使用して和集合演算を行います。演算子が実行されると、左右のサブノードのすべての出力結果が順番に出力されます。
obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES(1,1);
Query OK, 1 rows affected
obclient> INSERT INTO t1 VALUES(2,2);
Query OK, 1 rows affected
Q1:
obclient> EXPLAIN SELECT c1 FROM t1 UNION ALL SELECT c2 FROM t1;
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)
上記の例では、実行計画表示のoutputs & filtersにおいて、UNION ALL演算子の出力情報が詳細に示されています。
| 情報名 | 意味 |
|---|---|
| output | この演算子の出力式です。 |
| filter | この演算子上のフィルタ条件です。例ではUNION ALL演算子にfilterが設定されていないため、nilとなります。 |
MERGE UNION DISTINCT
MERGE UNION DISTINCTは、結果セットに対して並合を行い、重複を削除した後に出力するために使用されます。
以下の例では、Q2が2つのクエリに対してUNION DISTINCTを使用して結合し、c1列にはソート可能なデータがあります。演算子0はMERGE UNION DISTINCTを生成して並合と重複除去を行います。c2列にはソート可能なデータがないため、演算子3にSORT演算子が割り当てられてソートが行われます。演算子の実行時には、左右のサブノードから順序付き入力を読み取り、結合して順序付き出力を得て重複を削除します。
Q2:
obclient> EXPLAIN SELECT c1 FROM t1 UNION SELECT c2 FROM t1;
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)
上記の例の実行計画表示におけるoutputs & filtersは、MERGE UNION DISTINCT演算子の出力情報を詳細に示しており、フィールドの意味はUNION ALL演算子と同じです。
HASH UNION DISTINCT
HASH UNION DISTINCTは、結果セットに対して並集を行い、重複を削除した後に出力するために使用されます。
以下の例では、Q3は2つのクエリに対してUNION DISTINCTを使用して結合し、ソートを利用できません。演算子0はHASH UNION DISTINCTを使用して並集と重複削除を行います。演算子の実行時には左右のサブノードから出力を読み取り、ハッシュテーブルを構築して重複を削除し、最終的に重複を削除した結果を出力します。
Q3:
obclient> EXPLAIN SELECT c2 FROM t1 UNION SELECT c2 FROM t1;
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)
上記の例の実行計画表示におけるoutputs & filtersは、HASH UNION DISTINCT演算子の出力情報を詳細に示しており、フィールドの意味はUNION ALL演算子と同じです。