ORACLE SQLのヒントとは

本日は、ORACLE SQLにおけるヒントを紹介します。

ヒントとは、その名の通り、”ヒント”です。
ORACLEが最適な実行計画、アクセスパスでSQLを実行するように促すために使います。

SQLを実行したとき、ORACLEはオプティマイザが最適な実行計画を作成し、それに従ってデータを取得します。
そのため、通常はSQLを実行する人が実行計画やアクセスパスを

しかし、オプティマイザが作成する実行計画も万全ではありません。
SQL作成者の狙い通りの実行計画とならない場合があります。

そうしたときに、より狙い通りの実行計画に導くためにヒントを与えます。

ヒントを与えることで、多少、統計情報が古い場合でも、最適な実行計画を作成することが出来ます。
更にヒントはSQLのSELECT句やWHERE句を変更する必要はないため、ヒントの有無によって実行結果は変わりません。

そのため、アプリケーションの実行結果を変更せずに、SQLのパフォーマンスだけを向上させる目的で利用できます。

いくつか、ヒントのサンプルケースを紹介します。
・作成したインデックスが使われない場合のヒント
select /*+INDEX(a IX_table1_001)*/ * from table1 a where a.col1 = :cond;

・FROM句に書いたテーブルの順番で結合したい場合のヒント
SELECT /*+ORDERED*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = b.COL1

・テーブル結合の順序を任意に決めたい場合のヒント
SELECT /*+LEADING(b,a)*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = b.COL1

・テーブル同士をネステッドループで結合したい場合のヒント
SELECT /*+USE_NL(a b)*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = b.COL1

・テーブル同士をハッシュジョインで結合したい場合のヒント
SELECT /*+USE_HASH(a b)*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = b.COL1

※もちろん、複数のヒントを同時に利用することもできます。
・ORDEREDヒントとUSE_NLを同時に利用した場合
SELECT /*+ORDERED USE_NL(a b)*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = b.COL1

他にも、SQLにはいろいろなチューニング方法があります。
↓こちらもぜひ参考にしてください。
SELECT文のSQLチューニング方法まとめ