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演算子と同じです。