はじめに
今までは適切なデータを抽出するクエリの書き方しか視野に入れられませんでしたが、次第にパフォーマンスのことも考慮するようになりました。
複雑なSQL文になればなるほどかなり重要になってくるので、少しでもパフォーマンスが改善できる記載を備忘録として残そうと思います
データの内容によってパフォーマンス結果が変わってくるので、すべてに適用されるとは限らないことを予めご承知おきください。
パフォーマンス改善4選
1. SELECT句の"*"
SELECT句は取得したいカラムを指定しますが、"*"はすべてのカラムを取得します。
必要なカラムのみを指定するときとで負荷がだいぶ異なるので、取得したいカラム名のみを記載することをおすすめします。
employeeテーブル
id | name | busyo | shikaku |
---|---|---|---|
1 | A | 開発部 | あり |
2 | B | 管理部 | あり |
3 | C | 営業部 | あり |
4 | D | 採用部 | あり |
5 | E | 管理部 | あり |
6 | F | 営業部 | なし |
SELECT * FROM crane.employee;
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 | 営業部 | なし |
SELECT * FROM crane.employee
WHERE busyo = '営業部'
AND shikaku = 'なし';
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 | 営業部 | なし |
SELECT * FROM crane.employee
ORDER BY 3;
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 | 営業部 | なし |
SELECT busyo FROM crane.employee;
SELECT E.busyo FROM crane.employee AS E;
最後に
今回は、SQLのパフォーマンスを向上する記載方法をご紹介いたしました。
大幅に改善できる見込みがある書き方は勉強中なので、今後新たな学びを得られたら記事にしようと思います。
最後までお読みいただき、ありがとうございました