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 の重複を除去し、Hash アルゴリズムを使用することを指定しています。 |
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 アルゴリズムを使用することを指定しています。 |