グローバルヒントタイプのその他のヒントにより、開発者とデータベース管理者はSQL文の実行を細かい粒度で制御できます。サポートされているその他のヒントタイプは以下のとおりです:
| ヒント名 | 説明 |
|---|---|
APPEND |
INSERTと同時に統計情報を収集する。また、INSERT INTO SELECTでダイレクトロードモード(DIRECT INSERT)を有効にする。 |
CURSOR_SHARING_EXACT |
クエリをパラメータ化するかどうかを制御します。 |
DIRECT |
LOAD DATAおよびINSERTステートメントでダイレクトロード機能を有効にして、データインポートの効率とパフォーマンスを向上させることができます。 |
NO_DIRECT |
LOAD DATAステートメント、INSERT INTO SELECTステートメント、およびCREATE TABLE AS SELECTステートメントでダイレクトロード機能を無効にします。 |
USE_PX |
SQLステートメントの実行時にPXモードを使用します。PXモードでは、ステートメントの実行時にマルチスレッド方式を採用できます。 |
ENABLE_PARALLEL_DML |
パラレルDMLを有効にします。 |
DISABLE_PARALLEL_DML |
パラレルDMLを無効にします。 |
ENABLE_PARALLEL_DAS_DML |
現在のDMLステートメントで、Distributed Data Access Service (DAS)の並列書き込み最適化を強制的に有効にするよう指定します。 |
DISABLE_PARALLEL_DAS_DML |
現在のDMLステートメントで、Distributed Data Access Service (DAS)の並列書き込み最適化を無効にするよう指定します。 |
DYNAMIC_SAMPLING |
動的サンプリングを有効にします。 |
LOAD_BATCH_SIZE |
1回の挿入で処理するバッチサイズを指定します。LOAD DATAでのみ使用されます。 |
LOG_LEVEL |
現在のクエリの実行中に記録するログレベルを指定します。 |
MAX_CONCURRENT |
クエリで許可される最大並列数を設定します。 |
MONITOR |
クエリでSQL Plan Monitorのキャプチャを有効にします。 |
MV_REWRITE |
MV_REWRITEヒントを単独で使用する場合、マテリアライズドビューのクエリ書き換えルール/コストチェックをスキップし、使用可能な書き換えを直接使用できます。 |
NO_MV_REWRITE |
マテリアライズドビューのクエリ書き換えを禁止し、query blockを指定できます。 |
OPT_PARAM |
クエリレベルのオプティマイザ関連パラメータを設定します。 |
PARALLEL |
クエリレベルの並列度を設定します。その逆操作はNO_PARALLELです。 |
NO_PARALLEL |
クエリのパラレル処理を無効にします(つまり、パラレル度を1に設定します)。 |
QUERY_TIMEOUT |
クエリ実行のタイムアウト時間を設定します。 |
READ_CONSISTENCY |
読み取りの一貫性レベルの設定(強力/弱い)。 |
RESOURCE_GROUP |
このステートメントで使用されるリソースグループを強制的に指定します。 |
STAT |
クエリ演算子出力統計を追跡します。 |
TRANS_PARAM |
クエリレベルのトランザクション関連変数値を設定します。 |
TRACING |
クエリ実行演算子の出力を追跡します。 |
USE_PLAN_CACHE |
現在のクエリの計画キャッシュ(Plan Cache)使用ポリシーを指定するために使用されます。 |
APPEND ヒント
APPEND ヒントは、INSERT INTO SELECT ステートメントでダイレクトロード機能を有効にします。詳細については、INSERT INTO SELECT ステートメントを使用したデータのダイレクトロードを参照してください。
構文
/*+ APPEND */
例
INSERT /*+ append enable_parallel_dml parallel(16) */ INTO t2
SELECT * FROM t1;
CURSOR_SHARING_EXACT ヒント
CURSOR_SHARING_EXACT ヒントは、クエリレベルでパラメータ化を禁止するように指定します。
OceanBaseデータベースでは、SQLステートメント内のリテラルをバインド変数に置き換える機能がサポートされており、この機能は CURSOR_SHARING 変数によって制御されます。つまり、cursor_sharing='exact' の場合、パラメータ化は不要です。詳細については、cursor_sharingを参照してください。
構文
/*+ CURSOR_SHARING_EXACT */
例
以下のクエリ例では、CURSOR_SHARING_EXACT ヒントを使用してパラメータ化を禁止し、2組のパラメータを使用して4回実行した後、PLAN CACHEに異なるパラメータに対して2つのクエリプランが生成されました。
alter system flush plan cache global;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6;
SELECT sql_id, plan_id, statement FROM oceanbase.gv$ob_plan_cache_plan_stat where query_sql like "SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=%";
+----------------------------------+---------+---------------------------------------------------------+
| sql_id | plan_id | statement |
+----------------------------------+---------+---------------------------------------------------------+
| E024EB33213BF501D4CA7ABB81A195B5 | 13249 | SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5 |
| E024EB33213BF501D4CA7ABB81A195B5 | 13250 | SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6 |
+----------------------------------+---------+---------------------------------------------------------+
DIRECT ヒント
DIRECT ヒントは、LOAD DATA および INSERT ステートメントでダイレクトロード機能を有効にするために指定でき、データインポートの効率とパフォーマンスを向上させます。
構文
DIRECT ヒントの構文は以下のとおりです:
/*+ DIRECT (/*+ direct(need_sort, max_errors_allowed, load_mode) */)*/
パラメータの説明
need_sort:インポートデータをソートする必要があるかどうかを示します。trueはソートが必要であり、falseはソート不要であることを意味します。max_errors_allowed:許容される最大エラー行数を指定します。この数を超えると、インポートプロセスは失敗します。load_mode:インポートモードを指定します。パラメータオプションには以下が含まれます:full:デフォルト値で、フルインポートを意味します。inc:増分インポートを意味し、INSERTおよびIGNOREセマンティクスをサポートします。inc_replace:増分インポートを意味しますが、主キーの重複チェックは行われず、REPLACEセマンティクスの増分インポートと同等です。
例
LOAD DATA の DIRECT ヒントの例
増分ダイレクトロードを有効にする
LOAD DATA /*+ DIRECT(true, 0, inc) */
INFILE 'datafile.txt'
INTO TABLE mytable
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
この例では、DIRECT(true, 0, inc) は増分ダイレクトロードを有効にし、ソートを行い、最大0行のエラーを許容することを意味します。
フルダイレクトロードを有効にする
LOAD DATA
/*+ PARALLEL(4) DIRECT(true, 0, full) */
REMOTE_OSS INFILE 'oss://example.com/datafile.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
この例では、PARALLEL(4) は並列度を4に指定し、DIRECT(true, 0, full) はフルダイレクトロードを有効にし、ソートを行い、最大0行のエラーを許容することを意味します。
詳細については、ダイレクトロードを参照してください。
INSERT INTO SELECT の DIRECT ヒントの例
INSERT INTO SELECT ステートメントでは、ダイレクトロードを有効にするには enable_parallel_dml を併用する必要があり、書式は次のとおりです:/*+ direct(bool, int, load_mode)} enable_parallel_dml PARALLEL(N) */。
増分ダイレクトロードを有効にする
-- 増分ダイレクトロードとパラレルDMLを有効にし、old_tableのデータをnew_tableに増分インポートする
INSERT /*+ direct(true, 0, 'inc') enable_parallel_dml PARALLEL(4) */ INTO new_table (id, name, value)
SELECT id, name, value
FROM old_table;
この例では、direct(true, 0, 'inc') は増分ダイレクトロードを有効にし、データをソートし、最大0行のエラーを許容します。enable_parallel_dml はパラレルDMLを有効にします。PARALLEL(4) は並列度を4に設定します。
フルダイレクトロードを有効にする
-- フルダイレクトロードとパラレルDMLを有効にし、old_tableのデータをnew_tableに挿入する
INSERT /*+ direct(true, 0, 'full') enable_parallel_dml PARALLEL(4) */ INTO new_table (id, name, value)
SELECT id, name, value
FROM old_table;
この例では、direct(true, 0, 'full') はフルダイレクトロードを有効にし、データをソートし、最大0行のエラーを許容します。enable_parallel_dml はパラレルDMLを有効にします。PARALLEL(4) は並列度を4に設定します。
詳細については、INSERT INTO SELECTステートメントを使用したデータのダイレクトロードを参照してください。
NO_DIRECT ヒント
NO_DIRECT ヒントは、LOAD DATA ステートメント、INSERT INTO SELECT ステートメント、および CREATE TABLE AS SELECT ステートメントにおいて、ダイレクトロード機能を無効にします。
構文
NO_DIRECT ヒントの構文は以下のとおりです:
/*+ NO_DIRECT */
パラメータの説明
NO_DIRECT:単一のSQL文でダイレクトロードを強制的に無効にします。入力されたSQL文にこのヒントが含まれている場合、そのステートメント全体で他のダイレクトロードに関するヒントは無視され、通常のインポートが実行されます。
例
LOAD DATAステートメントでNO_DIRECTを使用する
LOAD DATA /*+ NO_DIRECT */ [REMOTE_OSS | LOCAL] INFILE 'file_name' INTO TABLE table_name [COMPRESSION]...INSERT INTO SELECTステートメントでNO_DIRECTを使用する
INSERT /*+ NO_DIRECT */ INTO table_name select_sentenceCREATE TABLE AS SELECTステートメントでNO_DIRECTを使用する
CREATE /*+ NO_DIRECT */ TABLE table_name [AS] select_sentence
DYNAMIC_SAMPLING ヒント
DYNAMIC_SAMPLING ヒントは、クエリで動的サンプリングを有効にするかどうかを指定します。
構文
/*+ DYNAMIC_SAMPLING ( 0 | 1 ) */
パラメータの説明
DYNAMIC_SAMPLING ヒントのパラメータの意味は以下のとおりです:
- パラメータが0の場合、動的サンプリングを無効にします。
- パラメータが1の場合、動的サンプリングを有効にします。
例
以下のクエリ例では、DYNAMIC_SAMPLING ヒントを使用して動的サンプリングを有効にします。
SELECT /*+ dynamic_sampling(1) */ *
FROM t1 WHERE c1 LIKE "%abc%" AND c2 LIKE "%abc%";
USE_PX ヒント
USE_PX ヒントは、サーバーがSQLステートメントを実行する際にPX(パラレル実行)モードを強制的に採用します。PXモードでは、複数のスレッドを使用してSQLステートメントを実行できるため、クエリ性能が向上します。通常、USE_PX ヒントと PARALLEL ヒントを一緒に使用して、パラレル実行のスレッド数を指定します。デフォルトでは、システムは USE_PX ヒントを使用します。
構文
USE_PX ヒントの構文は次のとおりです:
/*+ USE_PX */
例
USE_PX ヒントの例は次のとおりです:
SELECT /*+ USE_PX PARALLEL(4)*/ e.dept_id, sum(e.salary)
FROM emp e
WHERE e.dept_id = 1001 GROUP BY e.dept_id;
ENABLE_PARALLEL_DML ヒント
ENABLE_PARALLEL_DML ヒントは、現在のクエリでパラレルDMLを有効にすることを指定します。その逆のヒントは DISABLE_PARALLEL_DML であり、パラレルDMLを無効にするために使用されます。
詳細については、パラレルDMLを参照してください。
注意事項
/*+ENABLE_PARALLEL_DML PARALLEL(n)*/を使用する場合、システムは分散パラレルDML(PDML)の使用を優先します。現在の環境がPDMLをサポートしていない場合、システムはパフォーマンス最適化のためにDAS並列書き込みにフォールバックします。セッションレベルで強制的なパラレル度が設定されている場合、その実行動作は上記の動作と一致します。
現在の環境がパラレルDML(PDML)をサポートしていない場合でも、システムパラメータ
_enable_parallel_das_dmlがALTER SYSTEM SETコマンドでtrueに設定されている場合(デフォルト値はfalse)、ヒント/*+ENABLE_PARALLEL_DML PARALLEL(n)*/を使用しても、システムはDAS(分散アクティブストレージ)のパラレル書き込み操作を有効にしません。ALTER SYSTEM SETコマンドで_enable_parallel_das_dmlをtrueに設定した場合(デフォルトはfalse)、かつセッションレベルで強制的なパラレル度が設定されている場合、現在の環境がPDMLをサポートしていない場合でも、ヒント/*+ENABLE_PARALLEL_DML PARALLEL(n)*/を使用しても、DASのパラレル書き込み機能は有効になりません。
構文
/*+ ENABLE_PARALLEL_DML */
例
insert /*+ enable_parallel_dml parallel(8) */ into t2 select * from t1;
DISABLE_PARALLEL_DML ヒント
DISABLE_PARALLEL_DML ヒントは、現在のクエリでパラレルDMLを無効にすることを指定します。その逆のヒントは ENABLE_PARALLEL_DML であり、パラレルDMLを有効にするために使用されます。
詳細については、パラレルDMLを参照してください。
構文
/*+ DISABLE_PARALLEL_DML */
例
insert /*+ disable_parallel_dml parallel(8) */ into t2 select * from t1;
ENABLE_PARALLEL_DAS_DML ヒント
ENABLE_PARALLEL_DAS_DML ヒントは、現在のDMLステートメントでDistributed Data Access Service (DAS)並列書き込み最適化を強制的に有効にするために使用されます。その逆ヒントは DISABLE_PARALLEL_DAS_DML です。
注意事項
ENABLE_PARALLEL_DAS_DMLはENABLE_PARALLEL_DMLと一緒に使用する必要があります。ヒント
/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/の作用により、システムはDAS並列書き込みを強制オプションとし、PARALLEL(n)で指定された並列度に基づいて操作を実行します。システムパラメータ
_enable_parallel_das_dmlをALTER SYSTEM SETステートメントでtrue(デフォルトはfalse) に設定すると、ヒント/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/は無効になります。この場合、システムはDASの並列書き込み操作を実行しません。
構文
/*+ ENABLE_PARALLEL_DAS_DML */
例
insert /*+ ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
DISABLE_PARALLEL_DAS_DML ヒント
DISABLE_PARALLEL_DAS_DML ヒントは、現在のDMLステートメントでDistributed Data Access Service (DAS)の並列書き込み最適化を強制的に無効にするよう指定します。その逆のヒントは ENABLE_PARALLEL_DAS_DML です。
注意事項
DISABLE_PARALLEL_DAS_DMLはENABLE_PARALLEL_DMLと一緒に使用する必要があります。ヒント
/*+DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/を使用すると、PDMLなどの他の並列書き込み最適化オプションが有効になっていても、システムはDASの並列書き込みを無効にします。
構文
/*+ DISABLE_PARALLEL_DAS_DML */
例
insert /*+ DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
LOAD_BATCH_SIZE ヒント
LOAD_BATCH_SIZE ヒントは、LOAD DATA ステートメント内で、各挿入処理のバッチサイズを指定するために使用されます。
LOAD BATCH_SIZE ヒントでは、batch_size によって各挿入処理のバッチサイズが指定されます。 LOAD DATA の詳細については、LOAD DATAの紹介を参照してください。
構文
/*+ LOAD_BATCH_SIZE ( batch_size ) */
例
-- 4つの並列プロセスを使用してデータをインポートし、新しいデータをテーブルの末尾に追加します。また、`LOAD_BATCH_SIZE` ヒントを使用して、各バッチで処理するレコード数を1000件に設定します。
LOAD DATA /*+ PARALLEL(4) APPEND LOAD_BATCH_SIZE(1000) */
INFILE '/home/admin/test.csv' INTO TABLE t1;
LOG_LEVEL ヒント
LOG_LEVEL ヒントは、現在のクエリが実行される過程で記録するログレベルを指定するために使用されます。
LOG_LEVEL ヒントパラメータの log_level はログレベルを指定します。一般的なログレベルには ERROR/WARN/INFO/TRACE/DEBUG が含まれます。
ログレベルの詳細については、ログレベルを参照してください。
構文
/*+ LOG_LEVEL ( [']log_level['] ) */
例
-- LOG_LEVELヒントを使用して、`TRACE` レベルのログを使用するように指定します。
SELECT /*+ LOG_LEVEL(TRACE) */ *
FROM employees e
WHERE e.department_id = 1001;
MAX_CONCURRENT ヒント
MAX_CONCURRENT ヒントは、クエリ実行の最大並列数を指定するために使用されます。
MAX_CONCURRENT ヒントのパラメータ intnum は、指定されたクエリで許可される最大並列数です。クエリの並列数が許可される最大並列数を超えると、クエリ実行時にエラーが発生し、最大並列数に達したことを報告します。intnum を 0 に指定すると、クエリ実行時に常にエラーが発生します。
注意すべき点として、現在 MAX_CONCURRENT ヒントは直接クエリ内で使用できず、MAX_CONCURRENT ヒントのみを含むアウトラインを作成してクエリの制限を行い、特定のSQL_IDに対して MAX_CONCURRENT を使用して制限をかけることしかできません。
構文
/*+ MAX_CONCURRENT ( intnum ) */
例
-- このクエリは、識別子が 'EC102CB006383D732BC98797601D9B3B' のクエリに関連付けられたアウトライン otl1 を作成し、対応するクエリの最大パラレル実行数を 10 と指定します
CREATE OUTLINE otl1 ON 'EC102CB006383D732BC98797601D9B3B'
USING HINT /*+ max_concurrent(10) */;
MONITOR ヒント
MONITOR ヒントは、クエリの実行時にSQLプランモニターの記録を有効にするために使用されます。MONITOR ヒントを使用して、その実行プロセスをSQLプランモニターに記録できます。
パラレル実行が有効になっていないクエリについては、OceanBaseはその実行プロセスをSQLプランモニターに記録しません。
SQLプランモニターの詳細については、リアルタイム実行計画表示のリアルタイムSQLプランモニターセクションを参照してください。
構文
/*+ MONITOR */
例
-- MONITORヒントを使用してSQLプランモニターの記録を有効にします。
SELECT /*+monitor*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
マテリアライズドビューによるクエリの書き換えヒント
マテリアライズドビューによるクエリの書き換え制御には、MV_REWRITE と NO_MV_REWRITE の2つのヒントが含まれ、これら2つのヒントの優先順位はシステム変数 query_rewrite_enabled よりも高いです。
MV_REWRITE ヒント
MV_REWRITE の構文は以下のとおりです:
/*+ MV_REWRITE (@ queryblock [mv_name_list]) */
mv_name_list:
mv_name [, mv_name ...]
単独で MV_REWRITE ヒントを使用する場合、マテリアライズドビューのクエリ書き換えルール/コストチェックをスキップし、利用可能な書き換えを直接使用できます。ヒントの後に1つ以上のマテリアライズドビューを指定した場合、ルール/コストチェックをスキップするだけでなく、マテリアライズドビューのクエリ書き換えでは指定されたマテリアライズドビューのみを使用して書き換えを試み、指定されていないすべてのマテリアライズドビューは無視されます。
MV_REWRITE ヒントを使用してマテリアライズドビューを指定する場合、ENABLE QUERY REWRITE (現在のマテリアライズドビューの自動書き換えを有効にする) 句を持たないマテリアライズドビューを強制的に使用することはできません。また、システム変数 query_rewrite_integrity が enforced に設定されている場合、非リアルタイムマテリアライズドビューを強制的に使用することもできません。
NO_MV_REWRITE ヒント
NO_MV_REWRITE の構文は以下のとおりです:
/*+ NO_MV_REWRITE (@ queryblock) */
マテリアライズドビューのクエリ書き換えを禁止します。クエリブロックを指定できます。
マテリアライズドビューによるクエリの書き換えを制御するHintの使用例
ベーステーブル
tbl2を作成します。CREATE TABLE tbl2 (col1 INT, col2 INT);ベーステーブル
tbl2に2つのデータを挿入します。INSERT INTO tbl2 VALUES (1,2),(3,4);実行結果は次のとおりです:
Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0マテリアライズドビュー
mv1_tbl2を作成し、現在のマテリアライズドビューの自動書き換えを有効にします。CREATE MATERIALIZED VIEW mv1_tbl2 NEVER REFRESH ENABLE QUERY REWRITE AS SELECT * FROM tbl2;マテリアライズドビュー
mv2_tbl2を作成し、現在のマテリアライズドビューの自動書き換えを有効にします。CREATE MATERIALIZED VIEW mv2_tbl2 NEVER REFRESH ENABLE QUERY REWRITE AS SELECT * FROM tbl2 WHERE tbl2.col1 > 1;システム変数
query_rewrite_integrityをstale_toleratedに設定します。説明
MV_REWRITEおよびNO_MV_REWRITEHintはシステム変数query_rewrite_enabledよりも優先順位が高いため、query_rewrite_enabledを設定する必要はありません。ただし、非リアルタイムマテリアライズドビューを使用した書き換えを利用するには、query_rewrite_integrityをstale_toleratedに設定する必要があります。SET query_rewrite_integrity = 'stale_tolerated';MV_REWRITEHintを使用してマテリアライズドビューによる書き換えを試み、書き換えコスト/ルールチェックをスキップします。以下の2つのクエリはどちらもマテリアライズドビューmv1_tbl2を使用して書き換えられます。/*+mv_rewrite*/は、書き換え条件に合致するマテリアライズドビューを使用して書き換えを試みます。一度書き換え要件を満たすマテリアライズドビューが見つかると、その後のマテリアライズドビューは考慮されなくなり、書き換えコスト/ルールチェックもスキップされます。EXPLAIN SELECT /*+mv_rewrite*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;実行結果は次のとおりです:
+----------------------------------------------------------------------------------------------+ | Query Plan | +----------------------------------------------------------------------------------------------+ | ===================================================== | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ----------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|MV1_TBL2|1 |3 | | | ===================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [MV1_TBL2.COL1]), filter(nil), rowset=16 | | group([MV1_TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([MV1_TBL2.COL1]), filter([MV1_TBL2.COL1 > cast(1, NUMBER(-1, -85))]), rowset=16 | | access([MV1_TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([MV1_TBL2.__pk_increment]), range(MIN ; MAX)always true | +----------------------------------------------------------------------------------------------+ 14 rows in set/*+mv_rewrite(mv1_tbl2)*/は、mv2_tbl2を使用して書き換えを試み、書き換えコスト/ルールチェックをスキップします。EXPLAIN SELECT /*+mv_rewrite(mv2_tbl2)*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;実行結果は次のとおりです:
+-------------------------------------------------------------------------+ | Query Plan | +-------------------------------------------------------------------------+ | ===================================================== | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ----------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|MV2_TBL2|1 |3 | | | ===================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [MV2_TBL2.COL1]), filter(nil), rowset=16 | | group([MV2_TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([MV2_TBL2.COL1]), filter(nil), rowset=16 | | access([MV2_TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, | | range_key([MV2_TBL2.__pk_increment]), range(MIN ; MAX)always true | +-------------------------------------------------------------------------+ 14 rows in set
クエリで
mv2_tbl2を使用して書き換えることを指定していますが、クエリ文のWHERE条件が要件を満たしていないため、mv2_tbl2は書き換えに使用できず、このクエリではマテリアライズドビューによる書き換えは行われません。EXPLAIN SELECT /*+mv_rewrite(mv2_tbl2)*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 < 1 GROUP BY col1;実行結果は次のとおりです:
+--------------------------------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------------------------------+ | ================================================= | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|TBL2|1 |3 | | | ================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [TBL2.COL1]), filter(nil), rowset=16 | | group([TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([TBL2.COL1]), filter([TBL2.COL1 < cast(1, NUMBER(-1, -85))]), rowset=16 | | access([TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([TBL2.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------+ 14 rows in set/*+ no_mv_rewrite*/Hintを使用すると、マテリアライズドビューによるクエリの書き換えは行われません。EXPLAIN SELECT /*+no_mv_rewrite*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;実行結果は次のとおりです:
+--------------------------------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------------------------------+ | ================================================= | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|TBL2|1 |3 | | | ================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [TBL2.COL1]), filter(nil), rowset=16 | | group([TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([TBL2.COL1]), filter([TBL2.COL1 > cast(1, NUMBER(-1, -85))]), rowset=16 | | access([TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([TBL2.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------+ 14 rows in set
NO_PARALLEL ヒント
NO_PARALLEL ヒントは、クエリのパラレル処理を無効にする(つまり、パラレル度を1に設定する)ことを指定します。その逆のヒントは PARALLEL ヒントです。
NO_PARALLEL ヒントは /*+ parallel(1)*/ と同等です。
構文
/*+ NO_PARALLEL */
例
以下のクエリ例では、NO_PARALLEL ヒントを使用してクエリのパラレル処理を無効にします。
SELECT /*+ no_parallel */ c1, sum(distinct c2) FROM t1 GROUP BY c1;
NO_QUERY_TRANSFORMATION ヒント
NO_QUERY_TRANSFORMATION ヒントは、現在のクエリに対するいかなるクエリ変換も禁止します。
注意が必要な点として、Query Block ヒント内の NO_REWRITE ヒントとは異なり、NO_QUERY_TRANSFORMATION を使用しても、Query Block ヒントで有効にされた一部の変換を使用できないことです。
クエリ変換については、クエリ変換の概要を参照してください。
構文
/*+ NO_QUERY_TRANSFORMATION */
例
以下のクエリ例では、NO_QUERY_TRANSFORMATION ヒントを使用して、いかなるクエリ変換も禁止します。
SELECT /*+ NO_QUERY_TRANSFORMATION */ *
FROM (SELECT * FROM t1) v WHERE v.c1 = 3;
OPT_PARAM ヒント
OPT_PARAM ヒントは、クエリレベルで一部のオプティマイザー関連の構成パラメータ/システム変数を更新するように指定します。
構文
/*+ OPT_PARAM ( parameter_name [,] parameter_value ) */
パラメータの説明
parameter_name:構成パラメータまたはシステム変数の名前を指定します。parameter_value:指定する変数値を指定します。OPT_PARAMヒントは、以下のパラメータに有効です:rowsets_enabled: ベクトル化を有効/無効にします。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。rowsets_max_rows: バッチ返却行数batch_sizeのサイズを設定します。データ型はINTで、値の範囲は[0, 65535]です。値は一重引用符('')で囲むことはできません。enable_newsort: クエリでの newsort 最適化を有効/無効にします。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。use_part_sort_mgb: クエリでの part sort merge group by を有効/無効にします。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。enable_in_range_optimization: クエリでの in 最適化を有効/無効にします。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。xsolapi_generate_with_clause: クエリでの cte 抽出書き換えを有効/無効にします。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。preserve_order_forPagination: ページネーションクエリの実行時にorder byを追加して順序を保持するか、order byの追加を禁止するかを指定します。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。storage_card_estimation: ストレージ層による行の推定を使用するかどうかを指定します。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。workarea_size_policy: SQLワークエリアサイズの手動または自動調整ポリシーを設定します。データ型はVARCHARで、値の範囲は'MANUAL'が手動調整を、'AUTO'が自動調整を意味します。値は一重引用符('')で囲む必要があります。enable_rich_vector_format: ベクトル化2.0を有効/無効にします(セッションレベルのパラメータ)。データ型はVARCHARで、値の範囲は'TRUE'と'FALSE'です。値は一重引用符('')で囲む必要があります。spill_compression_codec: 一時的なマテリアライゼーションが必要な演算子に対して選択される圧縮アルゴリズムを指定します。データ型はVARCHARで、値はNONE、LZ4、SNAPPY、ZLIB、ZSTDで、それぞれ異なる圧縮アルゴリズムを表します。デフォルトはNONEで、圧縮は行われません。inlist_rewrite_threshold:inlist書き換えをvalues statementにトリガーするための定数数のしきい値を指定します。データ型はINT64で、値の範囲は[1, 2147483647]です。
例
以下のクエリでは、OPT_PARAM ヒントを使用して enable_in_range_optimization の値を指定し、現在のクエリでIN最適化を有効にします。
SELECT /*+ opt_param('enable_in_range_optimization', 'true') */ *
from t1
where c1 in (1,2,3,4,5,...,1000)
and c2 in (1,2,3,4,5,...,1000);
PARALLEL ヒント
PARALLEL ヒントはグローバルヒントとして使用される場合、現在のクエリで使用する並列度またはパラレル実行の有効化ポリシーを指定できます。
PARALLEL ヒントはグローバルヒントとして使用されるだけでなく、クエリブロックヒントとしても使用され、テーブルレベルの並列度を指定できます。詳細については、アクセスパスヒントのParallelヒント関連の内容を参照してください。
構文
/*+ PARALLEL ( AUTO | MANUAL | parallel_degree) */
パラメータの説明
AUTOまたはMANUAL:PARALLELヒントでパラメータとしてAUTOまたはMANUALを使用する場合、パラレル実行の有効化ポリシーのみを指定します。詳細については、パラレル実行の有効化方法と優先順位を参照してください。parallel_degree:PARALLELヒントでパラメータとしてparallel_degreeを使用する場合、並列度を直接指定できます。
例
以下のクエリ例では、PARALLEL ヒントを使用して、並列度DOP = 8を指定するか、Auto DOPを有効にするかを指定します。
SELECT /*+parallel(8)*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
SELECT /*+parallel(auto)*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
注意:一部のシナリオではパラレル実行がサポートされておらず、PARALLELを使用して並列処理を有効にした場合でも、実行計画によって並列処理が無効にされる可能性があります。
QUERY_TIMEOUT ヒント
QUERY_TIMEOUT ヒントは、現在のクエリの実行タイムアウト時間を指定します。
構文
/*+ QUERY_TIMEOUT ( time_usec ) */
パラメータの説明
time_usec:クエリのタイムアウト時間。単位はマイクロ秒です。
例
-- クエリのタイムアウト時間を1秒に指定します。指定されたタイムアウト時間内にクエリが完了しない場合、タイムアウトエラーが返されます。
SELECT /*+ QUERY_TIMEOUT(1000000) */ *
FROM employees e
WHERE e.department_id = 1001;
READ_CONSISTENCY ヒント
READ_CONSISTENCY ヒントは、現在のクエリの読み取り一貫性レベルを指定します。
構文
/*+ READ_CONSISTENCY(WEAK[STRONG]) */
パラメータの説明
WEAK:弱い一貫性を有効にし、弱い整合性読み取りを有効にします。STRONG:強い一貫性を有効にし、弱い整合性読み取りを無効にします。
例
-- READ_CONSISTENCYヒントを使用してWEAKに設定し、クエリで弱い整合性読み取りを有効にするように指定します。
SELECT /*+ READ_CONSISTENCY(WEAK) */ *
FROM employees
WHERE employees.department_id = 1001;
RESOURCE_GROUP ヒント
RESOURCE_GROUP ヒントは、このステートメントで使用されるリソースグループを強制的に指定します。
構文
RESOURCE_GROUP ヒントの構文は次のとおりです:
/*+ RESOURCE_GROUP ('resource_group_name') */
パラメータの説明
resource_group_nameは、指定するリソースグループ名を表します。
例
RESOURCE_GROUP ヒントを使用した例は次のとおりです:
obclient> SELECT /*+ RESOURCE_GROUP('big_group') */ * FROM t1;
この例では、リソースグループ big_group が存在しない場合、現在のデフォルトのリソースグループが使用されます。
STAT ヒント
STAT ヒントは、クエリ計画内の特定の演算子の出力を追跡するように指定します。
STAT ヒントを追加すると、クエリ計画に MONITORING DUMP 演算子が割り当てられます。この演算子は、サブノード演算子のすべてのデータを直接出力し、実行終了後に演算子の実行時間や出力行数などの情報をobserverログに出力します。
構文
/*+ STAT(TRACING_NUM_LIST) */
パラメータの説明
TRACING_NUM_LIST:追跡対象の演算子のIDリストです。
例
-- Hint `/*+ STAT(0, 2) */` を追加した前後での実行計画の変化
explain basic
SELECT /*+leading(t1) use_hash(t2)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Query Plan
===========================
|ID|OPERATOR |NAME|
---------------------------
|0 |HASH JOIN | |
|1 |├─TABLE FULL SCAN|T1 |
|2 |└─TABLE FULL SCAN|T2 |
===========================
explain basic
SELECT /*+leading(t1) use_hash(t2) stat(0, 2)*/ *
FROM t1, t2 where t1.c1 = t2.c1;
Query Plan
===============================
|ID|OPERATOR |NAME|
-------------------------------
|0 |MONITORING DUMP | |
|1 |└─HASH JOIN | |
|2 | ├─TABLE FULL SCAN |T1 |
|3 | └─MONITORING DUMP | |
|4 | └─TABLE FULL SCAN|T2 |
===============================
TRANS_PARAM ヒント
TRANS_PARAM ヒントは、クエリレベルでトランザクション関連のパラメータを指定するために使用されます。
構文
/*+ TRANS_PARAM ['FORCE_EARLY_LOCK_FREE' , 'TRUE'] */
パラメータの説明
現在サポートされているパラメータは、トランザクションレベルでの早期ロック解放 FORCE_EARLY_LOCK_FREE のみです。
FORCE_EARLY_LOCK_FREE:値として TRUE を指定した場合はサポートされ、FALSE を指定した場合はサポートされません。
注記:ここでのパラメータ名とパラメータ値は、シングルクォート(' ')で囲む必要があります。ただし、パラメータ値が数値型の場合は、クォートを省略できます。
例
-- TRANS_PARAMヒントを使用し、パラメータ 'FORCE_EARLY_LOCK_FREE' を 'TRUE' に設定して、トランザクションレベルでの早期ロック解放を指定します。
SELECT /*+ TRANS_PARAM('FORCE_EARLY_LOCK_FREE' 'TRUE') */ *
FROM employees e
WHERE e.department_id = 1001;
TRACING ヒント
TRACING ヒントは、クエリ計画内の特定の演算子の出力を追跡するように指定します。
TRACING ヒントの使用方法、ヒント追加後の計画の形態、および STAT ヒントを使用した場合と完全に同じです。
STAT ヒントを使用する場合との違いは、TRACING ヒントを使用すると MONITORING DUMP 演算子がそのすべての出力データをobserverログに出力する点です。
構文
/*+ TRACING(TRACING_NUM_LIST)*/
パラメータの説明
TRACING_NUM_LIST: 追跡対象の演算子のIDリストです。
例
-- TRACINGヒントを使用し、レベルを1に設定して現在のクエリのトレースを有効にする
SELECT /*+ TRACING(1) */ *
FROM employees e
WHERE e.department_id = 1001;
USE_PLAN_CACHE ヒント
USE_PLAN_CACHE ヒントは、現在のクエリの計画キャッシュ(Plan Cache)使用ポリシーを指定するために使用されます。計画キャッシュの詳細については、実行計画キャッシュを参照してください。
構文
/*+ USE_PLAN_CACHE ( NONE | DEFAULT ) */
パラメータの説明
NONE:クエリが計画キャッシュを使用しないように指定します。DEFAULT:現在のクエリがシステム変数ob_enable_plan_cacheで制御される計画キャッシュポリシーを使用するように指定します。
例
-- パラメータ `NONE` を使用すると、クエリが計画キャッシュを使用しないように指定されます。パラメータ `DEFAULT` を使用すると、現在のクエリがシステム変数 `ob_enable_plan_cache` で制御される計画キャッシュポリシーを使用するように指定されます。
SELECT /*+ USE_PLAN_CACHE(NONE) */ *
FROM employees e
WHERE e.department_id = 1001;
SELECT /*+ USE_PLAN_CACHE(DEFAULT) */ *
FROM employees e
WHERE e.department_id = 1001;