44
38

はじめに

今までは適切なデータを抽出するクエリの書き方しか視野に入れられませんでしたが、次第にパフォーマンスのことも考慮するようになりました。

複雑なSQL文になればなるほどかなり重要になってくるので、少しでもパフォーマンスが改善できる記載を備忘録として残そうと思います:writing_hand_tone1:

データの内容によってパフォーマンス結果が変わってくるので、すべてに適用されるとは限らないことを予めご承知おきください。

パフォーマンス改善4選

1. SELECT句の"*"

SELECT句は取得したいカラムを指定しますが、"*"はすべてのカラムを取得します。
必要なカラムのみを指定するときとで負荷がだいぶ異なるので、取得したいカラム名のみを記載することをおすすめします。

employeeテーブル
id name busyo shikaku
1 A 開発部 あり
2 B 管理部 あり
3 C 営業部 あり
4 D 採用部 あり
5 E 管理部 あり
6 F 営業部 なし
非推奨例.sql
SELECT * FROM crane.employee;
推奨例.sql
SELECT busyo FROM crane.employee;

2. WHERE句の条件指定の順番

WHERE句は取得したい条件を指定しますが、複数条件の場合記載した順に実行されます。
負荷を軽減するには、条件で絞った結果が少なくなる条件を先に記載すると、2つ目以降の条件実行の際にパフォーマンス力が向上します。

資格取得の人数が多い会社のテーブルから資格未保持で絞ってデータを取得するとなると、" shikaku = 'なし' "を先に記載したほうが良いです。
※データの特色によるので、レコード数が多いほど最初に全体を眺めて把握したほうが良いかと思います。

employeeテーブル
id name busyo shikaku
1 A 開発部 あり
2 B 管理部 あり
3 C 営業部 あり
4 D 採用部 あり
5 E 管理部 あり
6 F 営業部 なし
非推奨例(部署を先に絞り込み).sql
SELECT * FROM crane.employee
WHERE busyo = '営業部'
AND shikaku = 'なし';
推奨例(資格を先に絞り込み).sql
SELECT * FROM crane.employee
WHERE shikaku = 'なし'
AND busyo = '営業部';

3. ORDER BY句のカラム名指定

ORDER BY句はカラムごとに並び順を指定しますが、列番号を指定することも可能です。
しかし、列番号にするとカラムの解読処理が実行されるため、カラム名を指定するほうが良いみたいです。

employeeテーブル
id name busyo shikaku
1 A 開発部 あり
2 B 管理部 あり
3 C 営業部 あり
4 D 採用部 あり
5 E 管理部 あり
6 F 営業部 なし
非推奨例.sql
SELECT * FROM crane.employee
ORDER BY 3;
推奨例.sql
SELECT * FROM crane.employee
ORDER BY busyo;

4. テーブルに別名

テーブルに別名をつけSELECT句のカラムに別名を指定すると、カラムがどのテーブルの情報なのか解析する処理を省略できるようです。

employeeテーブル
id name busyo shikaku
1 A 開発部 あり
2 B 管理部 あり
3 C 営業部 あり
4 D 採用部 あり
5 E 管理部 あり
6 F 営業部 なし
非推奨例.sql
SELECT busyo FROM crane.employee;
推奨例.sql
SELECT E.busyo FROM crane.employee AS E;

最後に

今回は、SQLのパフォーマンスを向上する記載方法をご紹介いたしました。
大幅に改善できる見込みがある書き方は勉強中なので、今後新たな学びを得られたら記事にしようと思います。

最後までお読みいただき、ありがとうございました:unicorn:

44
38
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
38