親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

SQLのヒント句とは?パフォーマンスへの影響は?

※ヒント句はMySQLでもありますが、今回はOracle SQLの話です。

ヒント句とは?

SQLのヒント句は、SELECT・UPDATE・INSERT・MERGE・DELETEのいずれかのキーワードの後に書かれるものです。
例えば/*+ ALL_ROWS */などと書かれており、データベースが実行計画を作成する際に意図しない実行計画が作成されないように手動でオプティマイザを操作するために使用されます。
本来は実行計画はデータベースが最適と思われるものを勝手に作成してくれるものです。
しかし、毎回ユーザーの意図した実行計画が作成出来るとは限りません。
そんな時にヒント句を使用することで、実行計画の作成をアシストすることが可能になります。

ヒント句の書き方

Oracleのヒント句は「/*+」と「*/」で囲んで記載します。
ただのコメントアウトのようにも見えるため、ついつい「+」が抜けがちですが、これがないとヒント句と認識されずにただのコメントと見做されてしまうために注意が必要です。
ヒント句は複数指定できますが、記載箇所は1つにまとめなければいけません。
複数指定する場合は「/*+」と「*/」の間でスペース区切りで記載し、一行に収める必要があります。

ヒント句の種類

以下にORACLEのヒント句の一覧を記載します。
大量にありすぎてとても覚えられませんね。

  • ALL_ROWS
  • FIRST_ROWS
  • CLUSTER
  • CLUSTERING
  • NO_CLUSTERING
  • FULL
  • HASH
  • INDEX
  • NO_INDEX
  • INDEX_ASC
  • INDEX_DESC
  • INDEX_COMBINE
  • INDEX_JOIN
  • INDEX_FFS
  • INDEX_SS
  • INDEX_SS_ASC
  • INDEX_SS_DESC
  • NATIVE_FULL_OUTER_JOIN
  • NO_NATIVE_FULL_OUTER_JOIN
  • NO_INDEX_FFS
  • NO_INDEX_SS
  • NO_ZONEMAP
  • INMEMORY
  • NO_INMEMORY
  • INMEMORY_PRUNING
  • NO_INMEMORY_PRUNING
  • ORDERED
  • LEADING
  • USE_CUBE
  • NO_USE_CUBE
  • USE_HASH
  • NO_USE_HASH
  • USE_MERGE
  • NO_USE_MERGE
  • USE_NL
  • USE_NL_WITH_INDEX
  • NO_USE_NL
  • ENABLE_PARALLEL_DML
  • DISABLE_PARALLEL_DML
  • PARALLEL
  • NO_PARALLEL
  • PARALLEL_INDEX
  • NO_PARALLEL_INDEX
  • PQ_CONCURRENT_UNION
  • NO_PQ_CONCURRENT_UNION
  • PQ_DISTRIBUTE
  • PQ_FILTER
  • PQ_SKEW
  • NO_PQ_SKEW
  • CHANGE_DUPKEY_ERROR_INDEX
  • IGNORE_ROW_ON_DUPKEY_INDEX
  • RETRY_ON_ROW_CHANGE
  • FACT
  • NO_FACT
  • MERGE
  • NO_MERGE
  • NO_EXPAND
  • USE_CONCAT
  • REWRITE
  • NO_REWRITE
  • UNNEST
  • NO_UNNEST
  • STAR_TRANSFORMATION
  • NO_STAR_TRANSFORMATION
  • NO_QUERY_TRANSFORMATION
  • NO_XMLINDEX_REWRITE
  • NO_XML_QUERY_REWRITE
  • APPEND
  • APPEND_VALUES
  • NOAPPEND
  • CACHE
  • NOCACHE
  • CURSOR_SHARING_EXACT
  • DRIVING_SITE
  • DYNAMIC_SAMPLING
  • GATHER_OPTIMIZER_STATISTICS
  • NO_GATHER_OPTIMIZER_STATISTICS
  • MODEL_MIN_ANALYSIS
  • MONITOR
  • NO_MONITOR
  • OPT_PARAM
  • PUSH_PRED
  • NO_PUSH_PRED
  • PUSH_SUBQ
  • NO_PUSH_SUBQ
  • PX_JOIN_FILTER
  • NO_PX_JOIN_FILTER
  • QB_NAME
  • RESULT_CACHE
  • NO_RESULT_CACHE

上記以外にも、BYPASS_UJVCなどOracleのマニュアルに載っていないヒント句もあります。
※ちなみにBYPASS_UJVCは11g以降は使用できません。