適用可能な索引の検索
適用可能な索引を検索するために、問合せプロセッサはWHERE句の条件を調べて、そのような条件を各索引を定義する索引パスと"照合"し、一致した条件を索引検索条件に変換しようとします。一般的にWHERE句はANDまたはOR演算子で接続した1つ以上の条件で構成され、リーフが条件であり、内部ノードがAND/OR演算子であるツリーを形成します。条件がこのWHERE句ツリーのサブツリーであるとします。問合せプロセッサでは、最上位レベルのAND条件、つまり、ルートANDノードのオペランドとして表される条件のみが考慮されます。WHERE句にANDルートがない場合、WHERE式全体が単一の最上位レベルのAND条件とみなされます。問合せプロセッサは、現在、AND/ORツリーを結合的な正規形にするために並べ替えようとしていないことに注意してください。一方、ANDノードが子として別のANDノードを持たず、ORノードが子として別のORノードを持たないように、AND/ORツリーはフラット化されます。たとえば、式a = 10 and b < 5 and (c > 10 or c < 0)には、3つの最上位レベルのAND条件a = 10、b < 5および(c > 10 or c < 0)がありますが、式a = 10 and b < 5 and c > 10 or c < 0には、ルートとしてORがあり、式全体が単一の最上位レベルのAND条件とみなされます。簡潔にするために、この項の残りの部分では、条件という用語を使用して最上位レベルのAND条件を意味します。
問合せプロセッサは、ソート索引、つまりORDER BY句およびGROUP BY句に出現する式に従って表の行をソートする索引を見つけるために、これらの句の式も調べます。GROUP BY句およびORDER BY句の項で説明したように、ソート索引を使用すると、より効率的でメモリーを節約するソートおよびグループ化が行われます。
- 値または順序(any)比較演算子を使用するが、!=または!= anyを使用しない比較、
- IS NULL演算子とIS NOT NULL演算子、
- EXISTS条件とNOT EXISTS条件、および
- IN条件
索引は、その索引のエントリのみを使用して問合せを評価できる場合、つまり、関連付けられた行を取得する必要がない場合、問合せに関するカバー索引と呼ばれます。
問合せで索引が使用されている場合、その索引条件は索引スキャンによって評価されるため、問合せから削除されます。索引条件は「索引にプッシュされる」と言います。この項の残りの部分では、様々な問合せの例を介して、単純索引および複数キー索引の項の非Json索引を使用して、適用可能な索引についてさらに説明します。適用可能なjson索引を検索するアルゴリズムは、基本的に非json索引のアルゴリズムと同じです。ジオメトリ索引についても同様ですが、索引にプッシュされる地理検索条件は、索引スキャンから誤検出の結果を排除するために保持する必要があるため、問合せから削除されません。