最適な適用可能索引の選択

問合せの索引を選択するために、問合せプロセッサでは、ユーザーが指定した索引ヒントとともに単純なヒューリスティックが使用されます。

構文

hints ::= '/*+' hint* '*/'

hint ::= (
   (PREFER_INDEXES "(" name_path index_name* ")") |
   (FORCE_INDEX "(" name_path index_name ")") |
   (PREFER_PRIMARY_INDEX "(" name_path ")") |
   (FORCE_PRIMARY_INDEX "(" name_path ")")
   ) [STRING]

ヒントには、FORCE_INDEXヒントとPREFER_INDEXESヒントの2種類があります。FORCE_INDEXヒントは単一の索引を指定し、問合せでは他の索引が考慮されずに(強制索引の索引述語がない場合でも)、その索引が使用されます。ただし、問合せにソート順があり、強制索引がソート索引でない場合は、エラーがスローされます。PREFER_INDEXESヒントは1つ以上の索引を指定します。問合せプロセッサは、優先索引を使用する場合と使用しない場合があります。具体的には、強制索引がない場合、索引の選択は次のように機能します。

問合せプロセッサは、ヒューリスティックを使用して適用可能な各索引にスコアを割り当て、スコアが最も高い索引を選択します。複数の索引が同じスコアを持つ場合、選択される索引は、アルファベット順で他の索引よりも前の名前を持つ索引です。通常、優先索引は高いスコアを取得しますが、他の索引がより高いスコアを取得する可能性もあります。ヒューリスティックの詳細を説明することはこのドキュメントの範囲を超えていますが、次のような高レベルの決定が行われます。
  • 問合せに完全な主キーがある場合は、主索引が使用されます。
  • 問合せにソート順がある場合は、他の索引の選択性がより高い場合もソート索引が使用されます。
  • 前述のどちらにも該当しない場合は、優先される(PREFERヒントを介して)、カバリング、または完全なキーがある(つまり、各索引フィールドに等価述語がある)索引が高いスコアを取得し、通常は他の索引よりも優先されます。

FORCE_INDEXヒントとPREFER_INDEXESヒントは、名前で索引を指定します。主索引には明示的な名前がないため、主索引を強制または選択するために、さらに2つのヒント(FORCE_PRIMARY_INDEXおよびPREFER_PRIMARY_INDEX)を使用できます。ヒントは、SELECTキーワードの直後に表示される特別な種類のコメントとして問合せに挿入されます。関連する構文は次のとおりです。

コメント開始順序(/*)の直後(スペースなし)の+文字は、コメントをヒントに変更します。ヒントの最後の文字列は情報提供を目的としたものであり(ヒントのコメント)、問合せの実行には影響しません。