適用可能な索引の検索

適用可能な索引を検索するために、問合せプロセッサは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条件を意味します。

問合せプロセッサは、問合せに1つ以上の索引条件(関連表の行にアクセスする必要なしに、現在の索引エントリのコンテンツのみを使用して、索引スキャン中に評価可能な条件)が含まれている場合、索引を問合せに適用可能とみなします。索引条件は、開始条件、停止条件またはフィルタリング条件としてさらに分類されます。開始/停止条件は、索引スキャン中にスキャンされる最初/最後の索引エントリの確立に関与します。フィルタリング条件は、スキャンされるエントリの索引スキャン中に適用されます。現在の実装では、次の種類の条件が候補の開始/停止条件とみなされます。(a)値または順序(任意の)比較演算子を使用しますが、!=または!=anyを使用しない比較、(b) IS NULL演算子とIS NOT NULL演算子および(c) EXISTS条件とNOT EXISTS条件。ただし、WITH NO NULLS句を指定して索引を作成した場合、IS NULL条件とNOT EXISTS条件は、その索引の索引条件として使用できません。実際には、そのような索引は、問合せの索引付きフィールドごとに索引条件がある場合にのみ、問合せで使用できます。

GROUP BY句およびORDER BY句の項で説明したように、順序付けとグループ化には、order-byまたはgroup-by式に基づいて行をソートする1つ以上の索引が存在している必要があります。その結果、問合せの順序付けおよびグループ化の場合、適用可能な索引は、ソート/グループ化の実装に使用できる索引のみです。このような問合せや索引には索引条件がない場合があり、問合せの実行中に全索引のスキャンが実行されることを意味します。

索引は、その索引のエントリのみを使用して問合せを評価できる場合、つまり、関連付けられた行を取得する必要がない場合、問合せに関するカバー索引と呼ばれます。

問合せで索引が使用されている場合、その索引条件は索引スキャンによって評価されるため、問合せから削除されます。索引条件は「索引にプッシュされる」と言います。この項の残りの部分では、様々な問合せの例を介して、単純索引および複数キー索引の項の非Json索引を使用して、適用可能な索引についてさらに説明します。適用可能なjson索引を検索するアルゴリズムは、基本的に非json索引のアルゴリズムと同じです。ジオメトリ索引についても同様ですが、索引にプッシュされる地理検索条件は、索引スキャンから誤検出の結果を排除するために保持する必要があるため、問合せから削除されません。