SQLは幅広い分野で利用する言語です。
一部のフレームワークなどではSQLを書かずにデータベース運用ができるようになっていたりと、必要のない場合も合ったりもしますが、
細かい指定が出来ない所為で少し処理に困ってしまったりと不便なことが合ったり、そもそも処理効率が悪かったりとSQLを使いたくなることがあります。
そんなSQLですが、新人エンジニアがデータベースを運用する際の注意点として、以下の本を参考にさせていただきましたので、ご紹介していきます。
※本では内部の処理的な概念が抜けていたり、細かい説明がないので大半を調べて保管しています。
新人エンジニアのための データベースのしくみと運用がわかる本
目次
インデックスを張る
インデックスを張ることで、検索速度を向上させることができます。
インデックスとはどの行がどこにあるのかを探すための目次のようなもので、ある条件下で高速にデータベースを読み込むことができます。
書き方は以下です。
SQL SERVERの場合:
インデックスは複数作成することができ、WHERE句で条件指定するカラムそれぞれで作ることで処理を高速化できます。
ただし、以下の場合インデックスの効果が受けられない為、逆に作成しない方が良い場合があります。
・データ件数の少ないもの
・カラムに格納されているデータが2種類など少ない場合
・同じテーブル内のカラムで比較する
・ノットイコール「!=」が条件になっている
・ノットイン「NOT IN」が条件になっている
・LIKEでの後方一致「○○%」(前方一致には効果があります)
・カラムに保存されたデータに対して、計算処理を行っている場合
上記に該当する場合はインデックスを付けないようにした方が処理が早くなります。
VIEWのVIEWを作らない
VIEWを作ることで、複雑なSELECT文を新しいテーブルにしたように後の表示を楽にすることができます。
書き方は以下です。
SQL SERVERの場合:
またVIEWをVIEWするという事もでき、複雑なVIEW同士の掛け合わせなども可能ですが、内部的には実行のたびにSELECT文がすべて走っているので、処理速度が遅くなってしまうということで、本書では推奨されていません。
データの存在チェックはCOUNTよりもEXISTS
COUNTを使うことで、データ件数を数えることができますが、データの存在チェックをしたいだけであれば、EXISTSの方がパフォーマンスがいいそうです。
書き方は以下です。
SQL SERVERの場合:
WHERE EXISTS(
入れ子にするSELECT文
)
COUNT関数を使用する場合は「*」を使わない
COUNT関数を利用する際に「*」を使っても件数をカウントできます。
ただし、内部的にはカラム名一つを条件にするのと比べて、パフォーマンスが落ちてしまうので、インデックスの張られたカラムを指定するようにしましょう。
書き方は以下です。
SQL SERVERの場合:
ORよりもIN句を利用する
IN句に置き換え可能なOR演算子は、IN句に置き換えた方が処理効率が上がります。
それに加えて、IN句を使う場合、最も件数の多いデータを第一引数に指定しましょう。
書き方は以下です。
SQL SERVERの場合:
UNIONで重複が気にならないならUNION ALL
UNIONには言わずもがな、重複を削除する処理が走ってしまうので、UNION ALLに比べて処理が遅いです。
重複を削除する必要がなければUNION ALLを利用しましょう。
書き方は以下です。
SQL SERVERの場合:
UNION ALL
SELECT カラム名 FROM テーブルB
範囲指定はBETWEENを使う
範囲指定で「<」,「>」などの比較演算子を使うよりもBETWEENを利用した方が処理効率が上がります。
そのうえ、可読性も上がるため、積極的に使いましょう。
書き方は以下です。
SQL SERVERの場合:
(あるデータの1から5のデータを指定する場合)
WHERE句は最も合致しやすい条件から記述していく
IN句と同じ理由ですが、最も条件に合致しやすい(絞り込みができる)カラム名を指定した方がパフォーマンスが上がります。
書き方は以下です。
SQL SERVERの場合:
CHARよりもVARCHARを採用する
本書にはパフォーマンスが上がるとしか書いていませんが、それぞれのメリットとデメリットがあります。
CHAR型
・メリット
文字数が決まっているため、処理が早い
・デメリット
テーブルを作る際に指定した文字数よりも入ったデータの文字数が小さい場合に空白が勝手に入るので、メモリを圧迫しやすい
VARCHAR型
・メリット
入ったデータ分のメモリしかデータが入らない為、メモリの効率がいい
・デメリット
入ったデータの文字数が異なるため、処理が遅くなる(負荷がかかる)
テーブルに別名(エイリアス)をつける
テーブルを連結する際に「AS」などで別名を付けますが、可読性が上がるだけでなくパフォーマンスも上がるそうです。
書き方は以下です。
SQL SERVERの場合:
INNER JOIN テーブルB AS テーブルBの省略
ON テーブルAの省略.ID = テーブルBの省略.ID
(一応ASは省略可能です。)
まとめ
今回は本書の注意点・改善点のみ取り扱いましたが、
本書はデータベースの構造や基本的な部分についての説明が細かく説明されており、SQL初心者の序盤の序盤に買うには丁度いいと思います。
その他にも便利なスクリプトや今後データベースがどのような形になっていくのかも書いてあるので、見てみてもいいかもしれません。