sql >> データベース >  >> RDS >> Sqlserver

WHERE句は、INとJOINの前または後に実行する方が適切です

    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を許容可能なパフォーマンスの実行プランに変換するのが難しい場合、コードを簡略化するか、適切なインデックスまたはヒントを追加したり、ステップに分割したりすることができます。 >> より迅速に実行します-すべて侵襲性の連続した順序で。



    1. MySQLPDOクエリのbindParamでLIKEを使用する

    2. AndroidでSQLCipherを使用する

    3. Alibaba Cloud

    4. MySQLの既存の列にnull以外の制約を追加する方法