【SQL】SQLの実行順序(評価順序)を理解しよう! SQLの各句の実行順序を理解すると、パフォーマンスの向上につながります。
まえおき 

SQLを書く際、「select * from ~ where … group by 」といった順番で書きますよね。

SELECT文を含めSQLは、実行すると全体結果だけしか表示されないが、 SQLServerの内部ではSELECTやFROMなどの”句”毎に分解して解析されて実行されています。

SQLを理解する上で、各句の実行順序を知っていると、SQLのパフォーマンスの向上につながり、 また、複雑なSQLも書けるようになります。

SQLの実行順序を意識して使用する必要がある? 

例えば、以下のようなSQLを実行するとエラーになります。

select 工事名称 AS 工事名
  from 工事テーブル
 where 工事名 = 'テスト工事A'

理由は、where句がselect句よりも先に評価されるため、select句で列名を別名定義しても使用できないからです。

SQLの実行順序

SQLは、以下の順序で実行されます。 ※上から評価が早いもの順  

順番内容
1FROMテーブル指定
2ONテーブルの結合
3JOINテーブルの結合
4WHERE条件指定
5GROUP BYグループ化
6HANING,SUM,AVGなど関数,集計後の絞り込み
7SELECT検索
8DISTINCT検索
9ORDER BY並び替え
10TOP(LIMIT)取得条件の指定


JOINのON、WHEREで条件指定する場合の速さの違いについて

例)ONを用いた場合

SELECT A.ID
  FROM TABLE_A
  LEFT JOIN TABLE_B
    ON TABLE_A.ID = TABLE_B.ID
   AND TABLE_A.ID IN (’100’,'101','102')

例)WHEREを用いた場合

SELECT A.ID
  FROM TABLE_A
  LEFT JOIN TABLE_B
    ON TABLE_A.ID = TABLE_B.ID
 WHERE TABLE_A.ID IN (’100’,'101','102')

ONで指定できる場合、ONで指定した方が取得されるデータ量が少ないので、速いです。

ただし、JOIN後のカラムの状態に対して条件を指定したい場合などはONに書くと結果が異なるので注意が必要です。
結合条件と検索条件を混同しないように。

クエリを速くするには、とにかく早い段階で取得するデータ量を少なくする必要があります。

サブクエリをたくさん含む複雑なクエリを作成する場合も、最後にまとめてWHEREで絞るのではなく、
各サブクエリ内でレコード数を減らすようにしましょう。

サブクエリがある場合の実行順序について

サブクエリとは、クエリを入れ子にして、内側のクエリの評価をもとに、 外側のクエリの結果を取得するような処理です。

この場合、一番内側のクエリから読み解いていきます。
内側の結果に対し、基本的には外側のクエリを評価しています。

例)

SELECT A.ID
  FROM TABLE_A
 WHERE A.NAME in (SELECT B.NAME
                    FROM TABLE_B
                 )


SQLServerの実行プラン(実行計画)を確認する方法

実行プランは、SQLServerのオプティマイザ機能が、インデックスや統計情報、CPUやメモリ状態など あらゆる点を考慮して自動的に作成します。

「推定実行プランの表示」で確認可能です。 右から左に記載される。

※開発現場でよくあることなのですが、本番サーバーと開発環境でクエリ実行プランが異なることがあるので注意する必要があります

参照:SQL Server | 実行プランの確認方法

今日はここまで。