INNERJOINまたはLEFTJOINの左側のテーブルの場合、多くの場合、オプティマイザは、実際に任意のタイプの物理結合を実行する前に、最初にフィルタリングを実行する(最高の選択性)方がよいと判断します。明らかに物理的な操作の順序であり、より優れています。
ある程度、SQLを使用して、たとえばサブクエリの集計を使用して、これを制御(または干渉)できる場合があります。
クエリで制約を処理する論理的な順序は、既知の不変変換に従ってのみ変換できます。
だから:
SELECT *
FROM a
INNER JOIN b
ON a.id = b.id
WHERE a.something = something
AND b.something = something
論理的には次と同等です:
SELECT *
FROM a
INNER JOIN b
ON a.id = b.id
AND a.something = something
AND b.something = something
通常、実行計画は同じです。
一方:
SELECT *
FROM a
LEFT JOIN b
ON a.id = b.id
WHERE a.something = something
AND b.something = something
と同等ではありません:
SELECT *
FROM a
LEFT JOIN b
ON a.id = b.id
AND a.something = something
AND b.something = something
したがって、オプティマイザはそれらを同じ実行プランに変換しません。
オプティマイザーは非常にスマートで、ビューの折りたたみやテーブル値のインライン関数を含め、物事をかなりうまく動かすことができます。また、特定の種類の集計をかなりうまく押し下げることもできます。
通常、SQLを作成するときは、理解可能で、保守可能で、正確である必要があります。実行の効率に関しては、オプティマイザーが宣言型SQLを許容可能なパフォーマンスの実行プランに変換するのが難しい場合、コードを簡略化するか、適切なインデックスまたはヒントを追加したり、ステップに分割したりすることができます。 >> より迅速に実行します-すべて侵襲性の連続した順序で。