新人エンジニアがSQLを使う上での注意/改善点10個

SQLは幅広い分野で利用する言語です。

一部のフレームワークなどではSQLを書かずにデータベース運用ができるようになっていたりと、必要のない場合も合ったりもしますが、

細かい指定が出来ない所為で少し処理に困ってしまったりと不便なことが合ったり、そもそも処理効率が悪かったりとSQLを使いたくなることがあります。

そんなSQLですが、新人エンジニアがデータベースを運用する際の注意点として、以下の本を参考にさせていただきましたので、ご紹介していきます。

※本では内部の処理的な概念が抜けていたり、細かい説明がないので大半を調べて保管しています。

新人エンジニアのための データベースのしくみと運用がわかる本
データベースの本1の画像

インデックスを張る

インデックスを張ることで、検索速度を向上させることができます。

インデックスとはどの行がどこにあるのかを探すための目次のようなもので、ある条件下で高速にデータベースを読み込むことができます。

書き方は以下です。

SQL SERVERの場合:

CREATE INDEX 任意のINDEX名 ON テーブル名(カラム名)

インデックスは複数作成することができ、WHERE句で条件指定するカラムそれぞれで作ることで処理を高速化できます。

ただし、以下の場合インデックスの効果が受けられない為、逆に作成しない方が良い場合があります。

・データ件数の少ないもの
・カラムに格納されているデータが2種類など少ない場合
・同じテーブル内のカラムで比較する
・ノットイコール「!=」が条件になっている
・ノットイン「NOT IN」が条件になっている
・LIKEでの後方一致「○○%」(前方一致には効果があります)
・カラムに保存されたデータに対して、計算処理を行っている場合

上記に該当する場合はインデックスを付けないようにした方が処理が早くなります。

VIEWのVIEWを作らない

VIEWを作ることで、複雑なSELECT文を新しいテーブルにしたように後の表示を楽にすることができます。

書き方は以下です。

SQL SERVERの場合:

CREATE VIEW 任意のVIEW名 AS SELECT文

またVIEWをVIEWするという事もでき、複雑なVIEW同士の掛け合わせなども可能ですが、内部的には実行のたびにSELECT文がすべて走っているので、処理速度が遅くなってしまうということで、本書では推奨されていません。

データの存在チェックはCOUNTよりもEXISTS

COUNTを使うことで、データ件数を数えることができますが、データの存在チェックをしたいだけであれば、EXISTSの方がパフォーマンスがいいそうです。

書き方は以下です。

SQL SERVERの場合:

SELECT 任意の表示名FROM テーブル名
WHERE EXISTS(
入れ子にするSELECT文
)

COUNT関数を使用する場合は「*」を使わない

COUNT関数を利用する際に「*」を使っても件数をカウントできます。

ただし、内部的にはカラム名一つを条件にするのと比べて、パフォーマンスが落ちてしまうので、インデックスの張られたカラムを指定するようにしましょう。

書き方は以下です。

SQL SERVERの場合:

SELECT COUNT(カラム名) FROM テーブル名

ORよりもIN句を利用する

IN句に置き換え可能なOR演算子は、IN句に置き換えた方が処理効率が上がります。

それに加えて、IN句を使う場合、最も件数の多いデータを第一引数に指定しましょう。

書き方は以下です。

SQL SERVERの場合:

SELECT * FROM fruit WHERE name IN("データA","データB")

UNIONで重複が気にならないならUNION ALL

UNIONには言わずもがな、重複を削除する処理が走ってしまうので、UNION ALLに比べて処理が遅いです。

重複を削除する必要がなければUNION ALLを利用しましょう。

書き方は以下です。

SQL SERVERの場合:

SELECT カラム名 FROM テーブルA

UNION ALL

SELECT カラム名 FROM テーブルB

範囲指定はBETWEENを使う

範囲指定で「<」,「>」などの比較演算子を使うよりもBETWEENを利用した方が処理効率が上がります。

そのうえ、可読性も上がるため、積極的に使いましょう。

書き方は以下です。

SQL SERVERの場合:

SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 1 AND 5

(あるデータの1から5のデータを指定する場合)

WHERE句は最も合致しやすい条件から記述していく

IN句と同じ理由ですが、最も条件に合致しやすい(絞り込みができる)カラム名を指定した方がパフォーマンスが上がります。

書き方は以下です。

SQL SERVERの場合:

SELECT * FOMR テーブル名 WHERE 一致しやすい条件 AND 次に一致しやすい条件

CHARよりもVARCHARを採用する

本書にはパフォーマンスが上がるとしか書いていませんが、それぞれのメリットとデメリットがあります。

CHAR型

・メリット
文字数が決まっているため、処理が早い

・デメリット
テーブルを作る際に指定した文字数よりも入ったデータの文字数が小さい場合に空白が勝手に入るので、メモリを圧迫しやすい

VARCHAR型

・メリット
入ったデータ分のメモリしかデータが入らない為、メモリの効率がいい

・デメリット
入ったデータの文字数が異なるため、処理が遅くなる(負荷がかかる)

テーブルに別名(エイリアス)をつける

テーブルを連結する際に「AS」などで別名を付けますが、可読性が上がるだけでなくパフォーマンスも上がるそうです。

書き方は以下です。

SQL SERVERの場合:

SELECT * FROM テーブルA AS テーブルAの省略
INNER JOIN テーブルB AS テーブルBの省略
ON テーブルAの省略.ID = テーブルBの省略.ID

(一応ASは省略可能です。)

まとめ

今回は本書の注意点・改善点のみ取り扱いましたが、

本書はデータベースの構造や基本的な部分についての説明が細かく説明されており、SQL初心者の序盤の序盤に買うには丁度いいと思います。

その他にも便利なスクリプトや今後データベースがどのような形になっていくのかも書いてあるので、見てみてもいいかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA