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