DISTINCT 演算子は、データ行の重複を除去するために使用され、重複する NULL 値も除外します。
DISTINCT 演算子には、HASH DISTINCT と MERGE DISTINCT が含まれます。
HASH DISTINCT
HASH DISTINCT 演算子は、Hashアルゴリズムを使用して DISTINCT 演算を実行します。
例1:Hashアルゴリズムを使用して DISTINCT 演算を実行し、テーブル t1 の列 c1 の重複を除去する
obclient> CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE t2(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> EXPLAIN SELECT /*+USE_HASH_AGGREGATION*/ DISTINCT c1 FROM t1;
Query Plan:
|=======================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
---------------------------------------
|0 |HASH DISTINCT| |101 |99169|
|1 | TABLE SCAN |t1 |100000 |66272|
=======================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1]), filter(nil),
distinct([t1.c1])
1 - output([t1.c1]), filter(nil),
access([t1.c1]), partitions(p0)
上記の例では、実行計画表示において、演算子0番の HASH DISTINCT が重複除去演算を実行しています。outputs & filters は HASH DISTINCT 演算子の具体的な出力情報を詳細に示しています。
情報名 |
意味 |
|---|---|
| output | この演算子の出力列。 |
| filter | この演算子のフィルター述語。例では HASH DISTINCT 演算子に filter が設定されていないため、nil となります。 |
| partition | クエリでスキャンするパーティションを指定します。 |
| distinct | 重複を除去する列を指定します。例えば、distinct([t1.c1]) のパラメータ t1.c1 は、t1 テーブルの c1 列に対してハッシュアルゴリズムを用いた重複除去処理を行うことを指定します。 |
MERGE DISTINCT
MERGE DISTINCT 演算子は、Mergeアルゴリズムを使用して DISTINCT 演算を実行します。
例2:Mergeアルゴリズムを使用して DISTINCT 演算を実行する
obclient> EXPLAIN SELECT /*+NO_USE_HASH_AGGREGATION*/ DISTINCT c1 FROM t1;
Query Plan:
|=======================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
---------------------------------------
|0 |MERGE DISTINCT| |3 |40 |
|1 | SORT | |3 |39 |
|2 | TABLE SCAN |t1 |3 |37 |
=======================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1]), filter(nil),
distinct([t1.c1])
1 - output([t1.c1]), filter(nil), sort_keys([t1.c1, ASC])
2 - output([t1.c1]), filter(nil),
access([t1.c1]), partitions(p0)
上記の例では、演算子0 MERGE DISTINCT が重複除去演算を実行し、Mergeアルゴリズムを採用しています。また、演算子2が出力するデータは無秩序なため、MERGE DISTINCT 演算子が入力として必要とするデータは順序付けられている必要があります。そのため、重複除去演算を実行する前に、SORT 演算子を使用してデータをソートする必要があります。実行計画表示の outputs & filters は、MERGE DISTINCT 演算子の出力情報を詳細に示しています。
情報名 |
意味 |
|---|---|
| output | この演算子の出力列です。 |
| filter | この演算子のフィルターポーズド。例では MERGE DISTINCT 演算子に filter が設定されていないため、nil となります。 |
| distinct | 重複を除去する列を指定します。例えば、distinct([t1.c1]) のパラメータ t1.c1 は、t1 テーブルの c1 列に対して重複除去処理を行い、Merge アルゴリズムを採用することを指定します。 |