Distinct Hintは、DISTINCT キーワードを含むクエリを処理する際に、オプティマイザーが特定の動作を取るよう指示するために使用されます。
ヒントタイプ |
説明 |
|---|---|
USE_HASH_DISTINCT |
オプティマイザーが HASH アルゴリズムを使用して DISTINCT 操作を実行するようにします。逆の操作は 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 ヒントは、オプティマイザーが HASH アルゴリズムを使用して DISTINCT 操作を実行するように有効化します。その逆操作は 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 | |
| =========================== |
| 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 |
| 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 |
+-------------------------------------------------------------------+
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 のプッシュダウンを有効にします。ヒントを追加しない場合は、デフォルトで 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