グローバルヒントのその他の種類は、開発者やデータベース管理者が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文で、分散データアクセスサービス(DAS)の並列書き込み最適化を強制的に有効にする。 |
DISABLE_PARALLEL_DAS_DML |
現在のDML文で、分散データアクセスサービス(DAS)の並列書き込み最適化を無効にする。 |
DYNAMIC_SAMPLING |
動的サンプリングを有効にする。 |
LOAD_BATCH_SIZE |
毎回の挿入バッチサイズを指定するために使用され、LOAD DATAでのみ使用される。 |
LOG_LEVEL |
現在のクエリの実行プロセスで記録するログレベルを指定するために使用される。 |
MAX_CONCURRENT |
クエリが許可する最大同時実行者数を設定する。 |
MONITOR |
クエリの実行SQLプランモニター記録のキャプチャを有効にするために使用される。 |
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)使用戦略を指定するために使用される。 |
DISABLE_TRIGGER |
DMLで指定されたトリガーを無効にするために使用されます。 |
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 ヒントはクエリ内で直接使用することはできません。特定のSQL_IDに対して MAX_CONCURRENT ヒントを使用してクエリの制限をかけるには、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 Plan Monitorに記録しません。
SQL Plan Monitorの詳細については、リアルタイム実行計画表示のリアルタイムSQL Plan Monitorセクションを参照してください。
構文
/*+ MONITOR */
例
-- MONITORヒントを使用してSQL Plan Monitorの記録を有効にします。
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) */
マテリアライズドビューのクエリリライトを禁止します。クエリブロックを指定できます。
マテリアライズドビューのクエリリライト制御ヒントの使用例
ベーステーブル
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_REWRITEヒントの優先順位はシステム変数query_rewrite_enabledよりも高いため、query_rewrite_enabledを設定する必要はありません。ただし、query_rewrite_integrityをstale_toleratedに設定する必要があります。これにより、非リアルタイムマテリアライズドビューを使用したリライトが可能になります。SET query_rewrite_integrity = 'stale_tolerated';MV_REWRITEヒントを使用してマテリアライズドビューによるリライトを試み、リライトコスト/ルールのチェックをスキップします。以下の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*/ヒントを使用すると、マテリアライズドビューによるクエリのリライトは行われません。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]です。orc_filter_pushdown_level: ステートメントレベルの ORC 外部テーブル条件のプッシュダウンレベルを制御します。parameter_valueの値は以下のとおりです:説明
OceanBase データベースでは、
OPT_PARAMヒントのparameter_nameパラメータは、V4.4.0 以降でorc_filter_pushdown_levelの値をサポートしています。0:フィルタ条件のプッシュダウンを無効にすることを示します。1:ファイルレベルまでプッシュダウンすることを示します。2:ストライプレベルまでプッシュダウンすることを示します。3:ロウインデックスレベルまでプッシュダウンすることを示します。4:Encodingレベルまでプッシュダウンすることを示します。
parquet_filter_pushdown_level:ステートメントレベルのParquet外部テーブル条件のプッシュダウンレベルを制御します。parameter_valueの取り得る値は以下のとおりです:説明
OceanBaseデータベースでは、
OPT_PARAMヒントのparameter_nameパラメータは、V4.4.0バージョンからparquet_filter_pushdown_levelの値をサポートしています。0:フィルタ条件のプッシュダウンを無効にすることを示します。1:ファイルレベルまでプッシュダウンすることを示します。2:RowGroupレベルまでプッシュダウンすることを示します。3:Pageレベルまでプッシュダウンすることを示します。4:Encodingレベルまでプッシュダウンすることを示します。
例
以下のクエリに対し、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;
リピータブルリード(Repeatable Read)およびシリアライズ可能(Serializable)の分離レベルでは、弱い読み取りリクエストの実行がサポートされます。例は以下のとおりです。
obclient> SET transaction read only;
Query OK, 0 rows affected (0.001 sec)
obclient> SELECT /*+ read_consistency(weak)*/ * FROM t WHERE a=2;
+------+------+
| ID | A |
+------+------+
| NULL | 2 |
+------+------+
1 row in set (0.001 sec)
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;
DISABLE_TRIGGER ヒント
DISABLE_TRIGGER ヒントは、DMLで指定されたトリガーを無効にするために使用されます。
構文
/*+ disable_trigger[(trigger_name)] */
パラメータの説明
trigger_name:オプションのパラメータで、一時的に無効にするトリガー名を指定します。1つまたは複数のトリガー名を指定でき、複数の名前は,で区切ります。このパラメータを省略した場合、デフォルトでクエリで参照されているすべてのトリガーが無効になります。
例
以下のコマンドを実行すると、test_trigger1 という名前のトリガーが無効になります。
INSERT /*+ disable_trigger[(test_trigger1)] */ INTO test VALUES(2);