30 March, 1998 Updated
PCDN OracleWG S.Yamazaki
ここでは、実際どんな時にヒントを使うべきなのか...CBOでは、なにも指示がなくても最小コストのアクセスパスを選択すると言いました。
けれど、それは、厳密に統計が採られ、かつ、索引の数も多くない場合です。いろいろと運用していくうちに、自分の思うようなアクセスパスを選択してくれない時があるでしょう。そのためにヒントはあります。
| ヒントとは |
|---|
賢いCBOも索引の数がたくさんあったり、サンプリングの統計行数だけでは、最適なアクセスパスを選択してくれない場合もあります。ヒントは、そうした場合にコストベースの目標を変更(Oracleに指示を出す)するために使用します。
たとえば、Oracleが「ind_A」という索引を使用したパスを選択したが、思うような応答時間を得られない場合、「SELECT /*+ INDEX(tab_A, ind_B) */ * FROM table_A tab_a; 」という風に「/*+」と「 */」で囲った状態でヒントを与えることができます。
これは、「ind_Bという索引を使用してアクセスしなさい」というOracleに対する指示です。
ただし、使い方を誤ってヒントを書いても無視されたり、逆にコストがかかって遅くなってしまうときがありますので注意が必要です。
| ヒントの指定 |
|---|
オプティマイザは、コストベース・アプローチだけで認識します。ヒント「/*+ RULE */」以外のヒントを付けた場合は、必ずコストベース・アプローチを選択すると言うことです。
また、最適化アプローチを変更するヒントとして以下のものがあります。これは、ヒントが指定されると、初期化パラメーター「optimizer_mode」、ALTER SESSIONでのOPTIMIZER_GOALの指定に関わらず、ヒント指定されたアプローチが優先されます。
ヒントの指定方法は、SELECT文などの直後に、/*+ */ で囲んで指定します。(--+ も可)
ただし、そのヒント自体の構文に誤りがあってもエラーは戻しませんので、注意が必要です。確認するためには、EXPLAIN PLANなどを使用すると良いでしょう。
例1:SELECT /*+ RULE */ columns_list, ... FROM table_name;
例2:SELECT --+ FIRST_ROWS
columns_list, ... FROM table_name WHERE columns_name=xxx;
| ヒントの種類 |
|---|
以下にヒントの種類を網羅します。詳しい説明が必要な場合、「Oracle8 Server リリース8 チューニング」をご覧ください。
| 分類 | ヒント | 説明 |
|---|---|---|
| アクセス | FULL | 全表走査。 | ROWID | ROWID走査。 | CLUSTER | クラスタ走査。(クラスタ化された表のみ有効) | HASH | ハッシュ走査。 | HASH_AJ | NOT IN副問合わせをハッシュ逆結合で実行。 | INDEX | 索引の昇順走査。 | INDEX_ASC | 索引の昇順走査。 | INDEX_COMBINE | 指定されたビットマップ索引値を組合わせて実行。 | INDEX_DESC | 索引の降順走査。 | INDEX_FFS | 高速全索引走査。 | MERGE_AJ | NOT IN副問合わせをマージ逆結合で実行。 | AND_EQUAL | 単一列索引のマージ。 | USE_CONCAT | OR条件をUNION ALLで実行。 |
| 結合順序 | ORDERD | 結合順序をFROMの順序で実行。 | STAR | スター問合わせ。 | STAR_TRANSFORMAION | スター変換スター問合わせ。 |
| 結合方法 | USE_NL | ネステッド・ループ結合 | USE_MERGE | ソート・マージ結合 | USE_HASH | ハッシュ結合 | NO_MERGE | 非ソート・マージ結合 | DRIVING_SITE | 分散環境時での問合わせ実行サイトの指定 |
| パラレル実行 | PARALLEL | パラレル実行。 | NOPARALLEL | 非パラレル実行。 | APPEND | INSERT時の追加モード。 | NOAPPEND | INSERT時の上書きモード。 | PARALLEL_ | INDEX パーティーション索引のパラレル実行化。 |
| その他 | CACHE | 全表走査時にブロックをバッファキャッシュ内のMRUに配置する。 | NOCACHE | 全表走査時にブロックをバッファキャッシュ内のLRUに配置する。 | PUSYU_SUBQ | マージされてない副問合わせを最初に評価。 |