Distinct Hintは、DISTINCT キーワードを含むクエリを処理する際にオプティマイザーが特定の動作を取るよう指示するために使用されます。
| ヒントタイプ | 説明 |
|---|---|
USE_HASH_DISTINCT |
オプティマイザーが DISTINCT 演算を実行する際に HASH アルゴリズムを使用するようにします。その逆の操作は NO_USE_HASH_DISTINCT ヒントです。 |
NO_USE_HASH_DISTINCT |
オプティマイザーが DISTINCT 演算を実行する際に HASH アルゴリズムを使用しないようにします。その逆の操作は USE_HASH_DISTINCT ヒントです。 |
DISTINCT_PUSHDOWN |
ヒントオプティマイザーに、分散環境下での DISTINCT プッシュダウンを許可します。その逆の操作は NO_DISTINCT_PUSHDOWN ヒントです。 |
NO_DISTINCT_PUSHDOWN |
ヒントオプティマイザーに、分散環境下での DISTINCT プッシュダウンを禁止します。その逆の操作は DISTINCT_PUSHDOWN ヒントです。 |
USE_HASH_DISTINCT ヒント
USE_HASH_DISTINCT ヒントは、オプティマイザーが DISTINCT 演算を実行する際に HASH アルゴリズムを使用するようにします。その逆の操作は NO_USE_HASH_DISTINCT ヒントです。
構文
/*+ USE_HASH_DISTINCT [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、USE_HASH_DISTINCT を使用して HASH 重複排除アルゴリズムを有効にします。
-- `USE_HASH_DISTINCT` ヒントを使用して、クエリが `DISTINCT` 演算を実行する際に `HASH` アルゴリズムを採用するようにします
EXPLAIN BASIC SELECT /*+ USE_HASH_DISTINCT */ DISTINCT c1, c2, c3 FROM t1;
| Query Plan |
+-------------------------------------------------------------------+
| =========================== |
| |ID|OPERATOR |NAME| |
| --------------------------- |
| |0 |HASH DISTINCT | | |
| |1 |└─TABLE FULL SCAN|T1 | |
| =========================== |
| 出力とフィルター: |
| ------------------------------------- |
| 0 - 出力([T1.C1], [T1.C2], [T1.C3]), フィルター(nil), rowset=16 |
| distinct([T1.C1], [T1.C2], [T1.C3]) |
| 1 - 出力([T1.C1], [T1.C2], [T1.C3]), フィルター(nil), rowset=16 |
| アクセス([T1.C1], [T1.C2], [T1.C3]), パーティション(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T1.__pk_increment]), range(MIN ; MAX)always true |
+-------------------------------------------------------------------+
14 rows in set
NO_USE_HASH_DISTINCT ヒント
NO_USE_HASH_DISTINCT ヒントは、distinct操作で使用される具体的なアルゴリズムを無効にします。その逆の操作は USE_HASH_DISTINCT ヒントです。
構文
/*+ NO_USE_HASH_DISTINCT [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、NO_USE_HASH_DISTINCT を使用して、オプティマイザーが DISTINCT 演算子を実行する際に HASH アルゴリズムを使用することを無効にします。OceanBaseは HASH と MERGE の2種類の重複排除アルゴリズムをサポートしているため、NO_USE_HASH_DISTINCT ヒントを使用すると、実際にはMERGE重複排除アルゴリズムが使用されます。
-- `NO_USE_HASH_DISTINCT` ヒントを使用して、クエリが `DISTINCT` 演算子を実行する際に `HASH` アルゴリズムを使用せず、代わりに `MERGE` アルゴリズムを使用するようにします。
EXPLAIN BASIC SELECT /*+ NO_USE_HASH_DISTINCT */ DISTINCT c1, c2, c3 FROM t1;
+-------------------------------------------------------------------+
| Query Plan |
+-------------------------------------------------------------------+
| ============================= |
| |ID|OPERATOR |NAME| |
| ----------------------------- |
| |0 |MERGE DISTINCT | | |
| |1 |└─SORT | | |
| |2 | └─TABLE FULL SCAN|T1 | |
| ============================= |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T1.C1], [T1.C2], [T1.C3]), filter(nil), rowset=16 |
| distinct([T1.C1], [T1.C2], [T1.C3]) |
| 1 - output([T1.C1], [T1.C2], [T1.C3]), filter(nil), rowset=16 |
| sort_keys([T1.C1, ASC], [T1.C2, ASC], [T1.C3, ASC]) |
| 2 - output([T1.C1], [T1.C2], [T1.C3]), filter(nil), rowset=16 |
| access([T1.C1], [T1.C2], [T1.C3]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T1.__pk_increment]), range(MIN ; MAX)always true |
+-------------------------------------------------------------------+
DISTINCT_PUSHDOWN ヒント
DISTINCT_PUSHDOWN ヒントは、分散実行時にオプティマイザーが DISTINCT 操作をプッシュダウンし、各パーティションノードでローカルな重複除去圧縮を行うことを許可します。その逆の操作は NO_DISTINCT_PUSHDOWN ヒントです。
構文
/*+ DISTINCT_PUSHDOWN [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、DISTINCT_PUSHDOWN を使用して分散実行時の DISTINCT のプッシュダウンを有効にします。Hintが追加されていない場合、デフォルトで DISTINCT のプッシュダウンが行われます。
-- `DISTINCT_PUSHDOWN` ヒントを使用して、分散クエリで `DISTINCT` 操作を各パーティションノードにプッシュダウンする
CREATE TABLE tp1(c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) PARTITIONS 10;
EXPLAIN BASIC SELECT /*+ DISTINCT_PUSHDOWN */ DISTINCT c2, c3 FROM tp1;
+---------------------------------------------------------------------------+
| Query Plan |
+---------------------------------------------------------------------------+
| =============================================== |
| |ID|OPERATOR |NAME | |
| ----------------------------------------------- |
| |0 |PX COORDINATOR | | |
| |1 |└─EXCHANGE OUT DISTR |:EX10001| |
| |2 | └─HASH DISTINCT | | |
| |3 | └─EXCHANGE IN DISTR | | |
| |4 | └─EXCHANGE OUT DISTR (HASH)|:EX10000| |
| |5 | └─HASH DISTINCT | | |
| |6 | └─PX PARTITION ITERATOR| | |
| |7 | └─TABLE FULL SCAN |TP1 | |
| =============================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([INTERNAL_FUNCTION(TP1.C2, TP1.C3)]), filter(nil), rowset=16 |
| 1 - output([INTERNAL_FUNCTION(TP1.C2, TP1.C3)]), filter(nil), rowset=16 |
| dop=1 |
| 2 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| distinct([TP1.C2], [TP1.C3]) |
| 3 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| 4 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| (#keys=2, [TP1.C2], [TP1.C3]), dop=1 |
| 5 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| distinct([TP1.C2], [TP1.C3]) |
| 6 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| force partition granule |
| 7 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| access([TP1.C2], [TP1.C3]), partitions(p[0-9]) |
| is_index_back=false, is_global_index=false, |
| range_key([TP1.__pk_increment]), range(MIN ; MAX)always true |
+---------------------------------------------------------------------------+
NO_DISTINCT_PUSHDOWN ヒント
NO_DISTINCT_PUSHDOWN ヒントは、分散実行時にオプティマイザーが DISTINCT 操作をプッシュダウンすることを禁止します。その逆の操作を行うヒントが DISTINCT_PUSHDOWN ヒントです。
構文
/*+ NO_DISTINCT_PUSHDOWN [ ( [ @ qb_name ] ) ] */
例
以下のクエリ例では、NO_DISTINCT_PUSHDOWN ヒントを使用して、分散実行時の DISTINCT のプッシュダウンを禁止します。
-- NO_DISTINCT_PUSHDOWNヒントを使用して、分散クエリにおけるDISTINCT演算のプッシュダウンを禁止する
CREATE TABLE tp1(c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) PARTITIONS 10;
EXPLAIN BASIC SELECT /*+ NO_DISTINCT_PUSHDOWN */ DISTINCT c2, c3 FROM tp1;
+---------------------------------------------------------------------------+
| Query Plan |
+---------------------------------------------------------------------------+
| =============================================== |
| |ID|OPERATOR |NAME | |
| ----------------------------------------------- |
| |0 |PX COORDINATOR | | |
| |1 |└─EXCHANGE OUT DISTR |:EX10001| |
| |2 | └─HASH DISTINCT | | |
| |3 | └─EXCHANGE IN DISTR | | |
| |4 | └─EXCHANGE OUT DISTR (HASH)|:EX10000| |
| |5 | └─PX PARTITION ITERATOR | | |
| |6 | └─TABLE FULL SCAN |TP1 | |
| =============================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([INTERNAL_FUNCTION(TP1.C2, TP1.C3)]), filter(nil), rowset=16 |
| 1 - output([INTERNAL_FUNCTION(TP1.C2, TP1.C3)]), filter(nil), rowset=16 |
| dop=1 |
| 2 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| distinct([TP1.C2], [TP1.C3]) |
| 3 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| 4 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| (#keys=2, [TP1.C2], [TP1.C3]), dop=1 |
| 5 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| force partition granule |
| 6 - output([TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| access([TP1.C2], [TP1.C3]), partitions(p[0-9]) |
| is_index_back=false, is_global_index=false, |
| range_key([TP1.__pk_increment]), range(MIN ; MAX)always true |
+---------------------------------------------------------------------------+
27 rows in set