SQL チューニングでレスポンス改善に効果のあったポイント
SQLのレスポンス改善に効果のあった対応内容をまとめます。
環境はOracleですが、他のデータベースでも参考になると思います。
パフォーマンスは同じようなSQLでもテーブルのインデックスなどの構成やデータ量などの環境にかなり影響を受けるので、「私の場合はたまたま改善した」という可能性が大きいと思いますので、あくまで参考程度にご覧ください。
定数を使う
SELECT
T1.社員名
,T2.売上金額
FROM
社員マスタ T1
JOIN 売上明細 AS T2
ON T1.社員コード = T2.社員コード
AND T2.社員コード = 3 --追加
WHERE
T1.社員コード = 3上記のSQLでは社員コード=3のデータを取得しています。T2.社員コード = 3の条件はあってもなくても結果は変わりませんが、条件に追加したほうが早くなりました。
実際はもっと複雑なSQLで行ったので、このSQL文で効果があるのかどうかはわかりませんが、取得結果は変わらなくてもあえて定数の条件を指定することにより、パフォーマンスが改善する場合があります。
存在チェックはROWNUMの条件を指定する
SELECT 1
FROM
売上明細 T1
WHERE
T1.社員コード = 3
AND ROWNUM < 2 --追加上記のSQLでは社員コード=3の売上明細のデータがあるかどうかのチェックを行っています。
存在チェックのためのSQLではROWNUM < 2の条件を指定します。
COUNTなどで件数を取得してチェックしてしまいがちですが、0か1以上かの存在チェックの場合は件数を集計する必要はありません。
ROWNUMで行番号の条件を指定して、2行目以降のデータは取得しないようにすれば、パフォーマンスの改善が期待できます。
WITH句を使用する
大量のデータのあるテーブルを副問い合わせなどで何回も使用すると、パフォーマンスが悪化してしまいます。
同じような副問い合わせがあればWITH句を使用して1箇所にまとめてしまえば、レスポンス改善に効果があるかもしれません。詳しいWITH句の使い方はSQL WITH句でVIEWを作成し重複するSQL文をまとめるで紹介しています。
SQLを分ける
1回のSQLで一気にまとめて取得したほうがレスポンスは早いイメージがありますが、あまり大量のデータを扱うSQLを実行するとサーバーに負荷がかかってしまい、遅くなってしまうことがあります。
メインのSQLと外部結合で取得・集計していた部分のSQLで2回SQLを実行して取得し、マージするようなやり方でも、コーディングは大変かもしれませんが、レスポンス改善の効果はあるかもしれません。
インデックスについての注意点はSQL インデックスが効かない場合の原因と対処法にまとめていますので、合わせてご覧ください。