Oracle ヒント句
ヒント句
オプティマイザが適切な実行計画を選択してくれない、または不具合の影響等で性能要件を満たせない実行計画になることを抑止・安定化させる。
ただし、ヒントは融通が利かないため最終手段と考えるべき。
理由としてヒントで実行計画を固定した場合、経年劣化・データや検索傾向の変化に追随することはできないため。
そのため、使用する場合には十分に考慮・検証する必要がある。
ヒント一覧
Category | Hint | Description |
---|---|---|
最適化目標 | ALL_ROWS | スループット優先指示(バッチ/BI系向き。但しOLTP的なSQL文をループで繰り返し実行するタイプのバッチを除く) |
FIRST_ROWS | レスポンス優先、最初のN行を最も速く返すような実行計画を立てるように指示する(OLTP向き) | |
アクセス パス |
INDEX (NO_INDEX) INDEX_ASC INDEX_DESC |
指定表の指定索引を利用する(しない)を指示。但し索引がどのようにアクセスされるかは指定できない(範囲検索ではなく全索引スキャンやスキップスキャンでアクセスされる可能性がある)。スキャン方向も制御したい場合には、INDEX_ASC/INDEX_DESCを使う |
INDEX_SS(NO_INDEX_SS) INDEX_SS_ASC INDEX_SS_DESC |
指定した索引のスキップスキャンを行うよう(行わないよう)指示する。スキャン方向も(昇順、降順)指示したい場合は、INDEX_SS_ASC/INDEX_SS_DESCを使う | |
FULL | 指定した表を全表走査を指示する | |
INDEX_JOIN | 指定された索引を結合したスキャンを行うよう指示する。必要な列が必要最小限の索引に含まれている必要がある。索引だけを参照する実行計画になる。 | |
NATIVE_FULL_OUTER_JOIN (NO_NATIVE_FULL_OUTER_JOIN) |
ネイティブ完全外部結合を使用するようオプティマイザに指示する。ネイティブ完全外部結合は、ハッシュ結合に基づくネイティブ実行メソッド。 | |
INDEX_FFS (NO_INDEX_FFSヒント) |
指定した索引を高速全索引走査を行う(行わない)よう指示 | |
INDEX_COMBINE | 指定された索引を基に内部でビットマップを作成し、作成されたビットマップを利用したスキャンを行うよう指示 | |
結合順 | ORDERED | FROM句に施術された順に結合を指示(開発者が結合を順を意識してFROM句に記述する必要がある) |
LEADING | ヒントに記述した表の順に結合するよう指示 | |
結合操作 | USE_HASH (NO_USE_HASHヒント) |
指定された各表をハッシュ結合を使用して別の行のソースに結合するようオプティマイザに指示(ハッシュ結合をしないように指示) |
USE_MERGE (NO_USE_MERGE) |
指定された各表をソート/マージ結合を使用して別の行のソースに結合するようオプティマイザに指示(ソート/マージ結合しないように指示) | |
USE_NL (NO_USE_NL) |
指定された表を内部表として使用し、指定された各表をネステッド・ループ結合とともに別の行のソースに結合するようオプティマイザに指示(ネステッド・ループ結合を行わないように指示) | |
USE_NL_WITH_INDEX | 指定された表を内部表として使用し、指定された表をネストしたループ結合とともに別の行のソースに結合するようオプティマイザに指示。結合述語に対応する索引が必要。通常はUSE_NLヒントで問題ないが想定された索引が結合に利用されない場合、意図した索引を結合に利用させるために利用する | |
問合せ 変換 |
MERGE(NO_MERGE) | インラインビューやビューを分解し、主問合せの結合にマージする(しない)よう指示 |
USE_CONCAT (NO_EXPAND) |
WHERE句のOR条件をUNION ALLを利用したクエリに書き換える(書き換えない)よう指示 | |
REWRITE (NO_REWRITE) |
クエリブロックを対応するMV参照へ書き換える(書き換えない)よう指示 | |
VECTOR_TRANSFORM (NO_VECTOR_TRANSFORM) |
VECTOR GROUP BYを行うか、行わせないかを指示。BI系でより効果を発揮する。RIGHT DEEP TREE形式の実行計画が選択されてもファクトの結合やグルーピングでCPU負荷となっているケースで、結合負荷、およびグルーピングによる負荷軽減による性能改善を狙う場合に利用 | |
UNNEST(NO_UNNEST) | IN句の副問合せ、EXISTS句の相関副問合せ(集計などGROUP BYの無いもの)、スカラー副問合せのネストを解除し結合への書き換えを指示(書き換えないよう指示) | |
パラレル 関連 |
PARALLEL (NO_PARALLEL) |
指定された並列度で実行するよう指示(シリアルで実行するよう指示)。文レベルのPARALLELヒントがオブジェクトレベルのPARALLELヒントより優先される。ソート操作またはグループ操作も実行する場合は指定された並列度の倍になる。 |
PQ_FILTER | 相関副問合せフィルタリング時の行の処理方法(分散処理するかどうか、分散方法)についてオプティマイザに指示 | |
PARALLEL_INDEX (NO_PARALLEL_INDEX) |
オブジェクトレベルのヒント。パーティション索引の索引レンジ・スキャン、全体スキャンおよび高速全体スキャンのパラレル化を指示 | |
PQ_CONCURRENT_UNION (NO_PQ_CONCURRENT_UNION) |
UNION操作とUNION ALL操作の並列処理を有効にするようオプティマイザに指示。(シリアル処理するよう指示) | |
PQ_DISTRIBUTE | プロデューサおよびコンシューマ問合せサーバーに行を分散させる方法をオプティマイザに指示 | |
PQ_SKEW (NO_PQ_SKEW) |
パラレル結合の結合キーの値の分散が著しく偏っている(つまり、同じ結合キー値を持つ行の割合が大きい)ことをオプティマイザに知らせる。(偏りがないことを知らせる)ハイブリッドハッシュ時で分散させる場合に利用できるヒント | |
その他 | APPENDヒント APPEND_VALUE(NOAPPEND) |
INSERT AS SELECTでダイレクトパスインサートを指示/INSERT VALUES文でダイレクトパスインサートを指示(ダイレクトパスインサートしないように指示) |
DYNAMIC_SAMPLING | 動的統計のサンプリングを方法をオプティマイザに指示 | |
OPT_PARAM | OPTIMIZER_DYNAMIC_SAMPLING、OPTIMIZER_INDEX_CACHING、OPTIMIZER_INDEX_COST_ADJ、OPTIMIZER_SECURE_VIEW_MERGINGおよびSTAR_TRANSFORMATION_ENABLEなど、いくつかの初期化パラメータと隠しパラメータを制御 | |
DRIVING_SITE | データベースリンクで結合された分散データベース環境において利用するヒント。SQL文を駆動するデータベースをオプティマイザに指示 | |
PUSH_PRED (NO_PUSH_PRED) |
結合述語をビューにプッシュするようオプティマイザに指示(プッシュしないようオプティマイザに指示) | |
PUSH_SUBQ (NO_PUSH_SUBQ) |
実行計画の初期段階でマージされていない副問合せを評価するようオプティマイザに指示(副問合せの評価を最後に行うよう指示)。マージされていない副問合せは、実行計画の最終に実行される。副問合せのコストが比較的低く、副問合せによって行数が大幅に減少する場合、副問合せの早期評価によってパフォーマンス が向上が期待できる | |
QB_NAME | 問合せブロックの名前を定義。通常内部的な名称を自動的に付与するが、それに替えてユーザが扱いやすい名前を定義することができる。グローバルヒント構文で使用するために定義することが一般的。 |