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 インデックスが効かない場合の原因と対処法にまとめていますので、合わせてご覧ください。