- 2010年7月11日 16:43
- DB
データベースを扱う言語としてSQL(Structured Query Language)があります。
今回は処理速度を上げるためのちょっとした記述ポイントをご紹介します。
- 結合した場合はすべての列名の前にテーブル名をつける
- IN句の引数リストには、該当する件数が多い値を左側から順に指定する
- 暗黙の型変換を回避する
- ワイルドカードは使わないようにする
- 列番号は使わないようにする
では順番に記述の仕方と処理速度が上がる理由を見て行きましょう。
使用テーブル
【社員表】
【部門表】
1.結合した場合は、すべての列名の前にテーブル名をつける
SELECT 社員名,社員表.給与,部門表.部門名 FROM 社員表
inner join 部門表
on 社員表.部門番号 = 部門表.部門番号;
↓
SELECT 社員表.社員名,社員表.給与,部門表.部門名 FROM 社員表
inner join 部門表
on 社員表.部門番号 = 部門表.部門番号;
【結果】
どちらも同じ結果ですが、指定した列名(社員名)に注目して下さい。
テーブル名を指定していないので、
どちらのテーブルにあるのか調べないといけないため、
実行速度が遅くなる可能性があります。
2.IN句の引数リストには、該当する件数が多い値を左側から順に指定する
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
WHERE 部門番号 IN(10,20);
↓
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
WHERE 部門番号 IN(20,10);
【結果】
IN句は左から評価し一致したら後の比較は行わない為、
左側に該当するデータが多ければ右の評価回数を減らせます。
3.暗黙の型変換を回避する
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
WHERE 部門番号 = '10';
↓
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
WHERE 部門番号 = cast('10' as SIGNED);
or
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
WHERE 部門番号 = 10;
【結果】
多くのデータベースでは、比較するデータ型が一致しない場合、
可能であれば暗黙の型変換が行なわれます。
暗黙の型変換は一度失敗した後に行なわれるため、
処理速度が遅くなることがあります。
正しいデータ型を指定するか、明示的に型変換をしましょう。
4.ワイルドカードは使わないようにする
SELECT * FROM 社員表;
↓
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表;
これに関しては、メンテナンス、わかりやすさの観点から推奨です。
5.列番号は使わないようにする
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
ORDER BY 4;
↓
SELECT 社員番号,社員名,雇用日,給与,部門番号 FROM 社員表
ORDER BY 給与;
【結果】
ORDER BY 句ではソートのキー列として、
実際の列名の代わりに列番号を指定できますが、
列名への読替えが発生するため、処理速度が遅くなることがあります。
まとめ
SQLの処理を高速化するためのポイントは、まだまだ他にもたくさん
ありますが、SQLを見直すことで改善できるものをご紹介しました。
ただ、SQLを学習したばかりの頃は正しい結果を得られることが一番ですので、
まずはそこを押さえましょう!
また、今回はMySQLでのSQL文を使用しています。
データベース製品によって記述が変わる部分がございますので、
ご了承下さい。
--------------------------------------------------------------------------------
パソコンスクール KENスクール大宮校 Programインストラクター
http://www.kenschool.jp/school/omiya/index.html
KENスクールでSQLを学びたい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html
- 次の記事へ: Google Chrome OS その4
- 前の記事へ: Google Chrome OS その3
