Oracle SQL の Hint(ヒント)句まとめ(一覧)

以前 Oracle SQLのHint句のメモ って記事を書きましたが、これが意外と検索されているんですよね。

バッチ処理向け SQL での話なのですが、パフォーマンスを突き詰めるとどうしてもヒント句に頼らざるを得ないケースがでてきます。なんでそっちのインデックス使うんだよぉ〜とか、何故かテーブルフルスキャンしてるときとか・・・その他もろもろ Oracle のコストベースの判定に泣きを見るケースがあります。

そんな僕もヒント句を使いこなせているわけではありません。

昨日 Oracle 使いなら手元におきたい! - 書評 - 詳解Oracle アーキテクチャ を書いていて知らないヒント句があまりにたくさんあったので一覧をまとめてみました。情報ソースはオラクルのマニュアルです。無料で入手できて、最も正しく、最も情報量が多い教科書です。(わかりやすいかどうかは全く別問題です。w)
※下記サイトの閲覧には OTN (Oracle Technology Network) への無料ユーザ登録が必要です。

Oracle Database オンライン・ドキュメント 10g リリース2 (10.2) の Oracle Database SQLリファレンス より
私的メモとして抜粋。

- スポンサーリンク -

一覧を示す前に、お約束事。ヒントを使用する場合は注意が必要です。マニュアルにも以下のように記載されています。

ヒントは、関連する表の統計情報を収集し、ヒントを使用せずにEXPLAIN PLAN文を使用してオプティマイザ計画を評価した後で使用してください。今回のリリース以降では、データベースの条件の変更と問合せのパフォーマンス強化によって、コード内のヒントがパフォーマンスに重大な影響を与えることに注意してください。
分類 オプティマイザヒント 説明








ALL_ROWS 文ブロックが最高のスループットになるよう(リソースの消費が最小になるよう)、オプティマイザに最適化の指示をします。
FIRST_ROWS 最初のn行を最も効率的に戻す計画を選択し、個々のSQL文を最適化して応答時間を速くするようOracleに指示します。





FULL 指定した表に対して全表スキャンを実行するようオプティマイザに指示します。
CLUSTER クラスタ・スキャンを使用して、指定した表にアクセスするようオプティマイザに指示します。このヒントは、クラスタ化された表にのみ適用されます。
HASH ハッシュ・スキャンを使用して、指定した表にアクセスするようオプティマイザに指示します。このヒントは、テーブル・クラスタ内に格納されている表にのみ適用されます。
INDEX 指定した表について索引スキャンを使用するようオプティマイザに指示します。ファンクション索引、ドメイン索引、Bツリー索引、ビットマップ索引およびビットマップ結合索引について、INDEXヒントを使用できます。
NO_INDEX 指定した表について1つ以上の索引を使用しないようオプティマイザに指示します。
INDEX_ASC 指定した表について索引スキャンを使用するようオプティマイザに指示します。文で索引レンジ・スキャンを使用する場合、Oracleデータベースは索引付きの値の昇順で索引エントリをスキャンします。
INDEX_DESC 指定した表に降順索引スキャンを使用するようオプティマイザに指示します。文で索引レンジ・スキャンを使用しており、索引が昇順の場合、Oracleは索引付きの値の降順で索引エントリをスキャンします。パーティション索引では、結果は各パーティション内で降順になります。降順索引の場合、このヒントは降順を効果的に取り消すため、索引エントリは昇順でスキャンされます。
INDEX_COMBINE 表へのビットマップ・アクセス・パスを使用するようオプティマイザに指示します。indexspecがINDEX_COMBINEヒントから省略されている場合、オプティマイザは、表のスキャンにかかるコスト効率が最大になる索引のブールの組合せを使用します。indexspecを指定すると、オプティマイザは、指定した索引のブールのいくつかの組合せの使用を試行します。
INDEX_JOIN アクセス・パスとして索引結合を使用するようオプティマイザに指示します。ヒントが正しく機能するためには、問合せの解決に必要なすべての列を含む索引が最小限の数だけ存在している必要があります。
INDEX_FFS 全表スキャンではなく高速全索引スキャンを実行するようオプティマイザに指示します。
NO_INDEX_FFS 指定された表の指定された索引の高速全索引スキャンを除外するようオプティマイザに指示します。
INDEX_SS 指定した表について索引スキップ・スキャンを実行するようオプティマイザに指示します。文で索引レンジ・スキャンを使用する場合、Oracleは索引付きの値の昇順で索引エントリをスキャンします。パーティション索引では、結果は各パーティション内で昇順になります。
NO_INDEX_SS 指定された表の指定された索引のスキップ・スキャンを除外するようオプティマイザに指示します。
INDEX_SS_ASC 指定した表について索引スキップ・スキャンを実行するようオプティマイザに指示します。文で索引レンジ・スキャンを使用する場合、Oracleデータベースは索引付きの値の昇順で索引エントリをスキャンします。パーティション索引では、結果は各パーティション内で昇順になります。
INDEX_SS_DESC 指定した表について索引スキップ・スキャンを実行するようオプティマイザに指示します。文で索引レンジ・スキャンを使用しており、索引が昇順の場合、Oracleは索引付きの値の降順で索引エントリをスキャンします。パーティション索引では、結果は各パーティション内で降順になります。降順索引の場合、このヒントは降順を効果的に取り消すため、索引エントリは昇順でスキャンされます。




USE_CONCAT 問合せのWHERE句内で組み合わされたOR条件を、集合演算子 UNIONALLを使用して複合問合せに変換するようオプティマイザに指示します。このヒントを使用しない場合、この変換は、連結を使用した問合せのコストが、使用しない場合よりも低い場合にのみ実行されます。USE_CONCATヒントは、コストより優先します。
NO_EXPAND OR条件を持つ問合せ用のOR拡張、またはWHERE句内にあるINリストを検討しないようオプティマイザに指示します。通常、オプティマイザは、OR拡張を使用しない場合よりもコストが低減できると判断すると、OR拡張の使用を検討します。
REWRITE 可能な場合、コストを考慮することなく、マテリアライズド・ビューに関する問合せをリライトするようオプティマイザに指示します。REWRITEヒントは、ビュー・リストとともに、またはビュー・リストなしで使用します。ビュー・リストとともにREWRITEを使用し、リストに適切なマテリアライズド・ビューが含まれている場合、Oracleはコストを考慮せずにそのビューを使用します。
NO_REWRITE パラメータQUERY_REWRITE_ENABLEDの設定を上書きして、問合せブロック用のクエリー・リライトを無効にするようオプティマイザに指示します。
MERGE

問合せ内のビューをマージできます。ビューの問合せブロックにGROUP BY句、またはSELECTリスト内のDISTINCT演算子が含まれている場合、複雑なビューのマージが可能であれば、オプティマイザはビューをアクセス文のみにマージできます。複雑なマージは、副問合せに相関関係がない場合、IN副問合せをアクセス文にマージする際に使用することもできます。

NO_MERGE 外部問合せとインライン・ビュー問合せを結合して単一の問合せにしないようオプティマイザに指示します。
STAR_TRANSFORMATION 変換を行う際に最適な計画を使用するようオプティマイザに指示します。このヒントを使用しない場合、オプティマイザは、変換された問合せ用の最適な計画のかわりに、変換なしで生成された最適な計画を使用するという、問合せの最適化に関する決定を行う場合があります。
NO_STAR_TRANSFORMATION 問合せのスター型問合せ変換を実行しないようオプティマイザに指示します。
NO_QUERY_TRANSFORMATION すべての問合せ変換をスキップするようオプティマイザに指示します。この中には、OR拡張、ビュー・マージ、副問合せのネスト解除、スター型変換、マテリアライズド・ビュー・リライトなどが含まれますが、これのみに限定されません。
FACT スター型変換のコンテキストで使用されます。このヒントは、tablespec内で指定されている表をファクト表とみなす必要があることをオプティマイザに指示します。
NO_FACT スター型変換のコンテキストで使用されます。このヒントは、問合せ対象の表をファクト表とみなす必要がないことをオプティマイザに指示します。
UNNEST 副問合せの本体のネストを解除し、その副問合せを含む問合せブロック本体にマージするようオプティマイザに指示します。これによって、アクセス・パスおよび結合の評価時に、オプティマイザが副問合せと問合せブロックを総合して考慮できるようになります。
NO_UNNEST ネスト解除をオフに切り替えます。



LEADING 実行計画において、指定した一連の表を接頭辞として使用するようオプティマイザに指示します。このヒントは、ORDEREDヒントより多目的なヒントです。図形結合の依存性により、指定の表を指定の順序の最初に結合できない場合、LEADINGヒントは無視されます。
ORDERED FROM句に現れる順序で表を結合するようOracleに指示します。ORDEREDヒントより多目的なLEADINGヒントを使用することをお薦めします。



USE_NL 指定された表を内部表として使用し、指定された各表をネストしたループ結合とともに別の行のソースに結合するようオプティマイザに指示します。LEADINGおよびORDEREDヒントとともに、USE_NLおよびUSE_MERGEヒントを使用することをお薦めします。オプティマイザは、参照表を結合の内部表にする必要がある場合に、これらのヒントを使用します。参照表が外部表の場合、ヒントは無視されます。
NO_USE_NL 指定された表を内部表として使用して、指定された各表を別の行のソースに結合する際に、ネストしたループ結合を除外するようオプティマイザに指示します。
USE_NL_WITH_INDEX 指定された表を内部表として使用し、指定された表をネストしたループ結合とともに別の行のソースに結合するようオプティマイザに指示します。
USE_MERGE 指定された各表を、ソート/マージ結合を使用して別の行のソースに結合するようオプティマイザに指示します。
NO_USE_MERGE 指定された表を内部表として使用して、指定された各表を別の行のソースに結合する際にソート/マージ結合を除外するようオプティマイザに指示します。
USE_HASH 指定された各表を、ハッシュ結合を使用して別の行のソースに結合するようオプティマイザに指示します。
NO_USE_HASH 指定された表を内部表として使用して、指定された各表を別の行のソースに結合する際にハッシュ結合を除外するようオプティマイザに指示します。





PARALLEL 指定された数の同時サーバーをパラレル操作に使用するようオプティマイザに指示します。このヒントは、文のSELECT、INSERT、MERGE、UPDATEおよびDELETE部分と表のスキャン部分に適用されます。
NO_PARALLEL 表を作成するか変更したDDL内のPARALLELパラメータを上書きします。
PQ_DISTRIBUTE 結合表の行を、プロデューサおよびコンシューマ問合せサーバーに分散させる方法をオプティマイザに指示します。この分散処理により、パラレル結合操作のパフォーマンスが向上します。
PARALLEL_INDEX パーティション索引について索引レンジ・スキャンをパラレル化するために、指定された数の同時サーバーを使用するようオプティマイザに指示します。
NO_PARALLEL_INDEX 索引を作成するか変更したDDL内のPARALLELパラメータを上書きし、パラレル索引スキャン操作を防止します。


APPEND データベースがシリアル・モードで実行されている場合、ダイレクト・パス・インサート文を使用するようにオプティマイザに指示します。Enterprise Editionを使用していない場合、データベースはシリアル・モードで実行されています。従来型のINSERTはシリアル・モードでのデフォルトです。また、ダイレクト・パス・インサートはパラレル・モードでのデフォルトです。
NOAPPEND INSERT文が有効な間、パラレル・モードを無効にして従来型のINSERTを使用するようにオプティマイザに指示します。従来型のINSERTはシリアル・モードでのデフォルトです。また、ダイレクト・パス・インサートはパラレル・モードでのデフォルトです。
CACHE 全表スキャンの実行時に、この表に対して取り出されたブロックを、バッファ・キャッシュ内のLRUリストの最高使用頻度側に入れるようオプティマイザに指定します。このヒントは、小規模な参照表で有効です。
NOCACHE 全表スキャンの実行時に、この表に対して取り出されたブロックを、バッファ・キャッシュ内のLRUリストの最低使用頻度側に入れるようオプティマイザに指定します。これは、バッファ・キャッシュ内のブロックの通常動作です。
PUSH_PRED 結合述語をビューにプッシュするようオプティマイザに指示します。
NO_PUSH_PRED 結合述語をビューにプッシュしないようオプティマイザに指示します。
PUSH_SUBQ 実行計画の初期段階で実行可能な手順で、マージされていない副問合せを評価するようオプティマイザに指示します。通常、マージされていない副問合せは、実行計画の最終手順で実行されます。副問合せのコストが比較的低く、副問合せによって行数が大幅に減少する場合、副問合せの早期評価によってパフォーマンスが向上する可能性があります。
NO_PUSH_SUBQ 実行計画における最後の手順として、マージされていない副問合せを評価するようオプティマイザに指示します。これにより、副問合せのコストが比較的高い場合や、副問合せによって行数が大幅に減少しない場合に、パフォーマンスが向上する場合があります。
QB_NAME 問合せブロックの名前を定義できます。この名前は外部問合せ内のヒントまたはインライン・ビュー内のヒントで使用でき、名前が付けられた問合せブロックにある表で実行する問合せに影響をおよぼします。
PX_JOIN_FILTER パラレル結合のビットマップ・フィルタ処理の使用をオプティマイザに強制します。
NO_PX_JOIN_FILTER オプティマイザがパラレル結合のビットマップ・フィルタ処理を使用するのを防ぎます。
NO_XML_QUERY_REWRITE SQL文のXPath式のリライトを禁止するようオプティマイザに指示します。
MODEL_MIN_ANALYSIS スプレッドシート・ルールのコンパイル時間の最適化(主に、詳細な依存グラフ分析)を省略するようオプティマイザに指示します。スプレッドシートのアクセス構造に選択的に移入するためのフィルタの作成や制限されたルールのプルーニングなど、他のスプレッドシートの最適化は、引き続きオプティマイザによって使用されます。
CURSOR_SHARING_EXACT リテラルのバインド変数への置換を試行せずにSQL文を実行するようオプティマイザに指示します。
DRIVING_SITE データベースによって選択されたサイトとは異なるサイトで問合せを実行するようオプティマイザに指示します。このヒントは、分散化された問合せの最適化を使用している場合に有効です。
DYNAMIC_SAMPLING 動的なサンプリングを制御する方法をオプティマイザに指示し、より正確な述語の選択性と表および索引に対する統計情報を調べることでサーバーのパフォーマンスを改善します。
- スポンサーリンク -