まえおき
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は、以下の順序で実行されます。 ※上から評価が早いもの順
順番 | 句 | 内容 |
---|---|---|
1 | FROM | テーブル指定 |
2 | ON | テーブルの結合 |
3 | JOIN | テーブルの結合 |
4 | WHERE | 条件指定 |
5 | GROUP BY | グループ化 |
6 | HANING,SUM,AVGなど | 関数,集計後の絞り込み |
7 | SELECT | 検索 |
8 | DISTINCT | 検索 |
9 | ORDER BY | 並び替え |
10 | TOP(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やメモリ状態など あらゆる点を考慮して自動的に作成します。
「推定実行プランの表示」で確認可能です。 右から左に記載される。
※開発現場でよくあることなのですが、本番サーバーと開発環境でクエリ実行プランが異なることがあるので注意する必要があります
今日はここまで。