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 列に対して重複を削除し、マージアルゴリズムを使用することを指定します。 |