INTERSECT 演算子は、左右の子ノードの演算結果に対して共通部分を取り、重複を除去します。
OceanBaseデータベースでサポートされている INTERSECT 演算子には、MERGE INTERSECT DISTINCT と HASH INTERSECT DISTINCT があります。
MERGE INTERSECT DISTINCT
以下の例では、Q1は2つのクエリにINTERSECTを適用して結合し、c1列にはソートが可能であるため、演算子0はMERGE INTERSECT DISTINCTを生成して、共通部分を求めて重複を除去します。c2列にはソートができないため、演算子3にSORT演算子が割り当てられてソートが実行されます。演算子の実行時には、左右の子ノードから順序付けられた入力を読み取り、その順序付けられた入力を用いてMERGEを行い、重複を除去して共通部分の結果を得ます。
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 INTERSECT SELECT c2 FROM t1;
Query Plan:
=================================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-------------------------------------------------
|0 |MERGE INTERSECT DISTINCT| |2 |77 |
|1 | TABLE SCAN |T1 |2 |37 |
|2 | SORT | |2 |39 |
|3 | TABLE SCAN |T1 |2 |37 |
=================================================
Outputs & filters:
-------------------------------------
0 - output([INTERSECT(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に、すべてのINTERSECT演算子の出力情報が詳細に示されています。
情報名 |
意味 |
|---|---|
| output | この演算子の出力式です。INTERSECT で結合された2つのサブ演算子の対応する出力、すなわち交差演算の出力結果の1列を表します。括弧内は左右の子ノードがこの列に対して出力する列です。 |
| filter | この演算子のフィルター条件です。例では INTERSECT 演算子に filter が設定されていないため、nil となります。 |
HASH INTERSECT DISTINCT
以下の例のように、Q2では2つのクエリを INTERSECT で結合していますが、利用可能なソートがないため、0番オペレーターは HASH INTERSECT DISTINCT を使用して共通部分を取得し、重複を除去します。オペレーターの実行時には、まず一方のサブノードの出力を読み取ってハッシュテーブルを作成し、重複を除去します。その後、もう一方のサブノードのデータを読み取り、作成したハッシュテーブルを用いて共通部分を取得し、重複を除去します。
Q2:
obclient> EXPLAIN SELECT c2 FROM t1 INTERSECT SELECT c2 FROM t1;
Query Plan:
================================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
------------------------------------------------
|0 |HASH INTERSECT DISTINCT| |2 |77 |
|1 | TABLE SCAN |T1 |2 |37 |
|2 | TABLE SCAN |T1 |2 |37 |
================================================
Outputs & filters:
-------------------------------------
0 - output([INTERSECT(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 INTERSECT DISTINCT オペレーターの出力情報を詳細に示しており、フィールドの意味は MERGE INTERSECT DISTINCT オペレーターと同じです。