SQL インデックスが効かない場合の原因と対処法
テーブルにインデックスを張っていても実行計画を見るとなぜかテーブルがフルスキャンされていて「なんで?」となった経験があるかと思います。
せっかく張ったインデックスが効かないSQL
の実装例と対処法を紹介します。
左辺に計算式を書いている
これは基本的なことかもしれませんが、インデックスを張ったカラムに計算式や関数を指定してしまうとインデックスが効かなくなってしまいます。
特にISNULL
、NVL
などのnull
を変換する関数をなんとなくつけているためインデックスが効かなくなるというケースには注意です。
SELECT T1.社員コード
FROM 社員マスタ T1
WHERE T1.年齢 - 1 = 20
--計算式は右辺に書く
SELECT T1.社員コード
FROM 社員マスタ T1
WHERE T1.年齢 = 20 + 1
OR条件を指定している
インデックスを張ったカラムをWHERE
句でOR
条件で指定するとインデックスが効かなくなってしまいます。
対処法として、コーディングはかなりの手間になってしまいますが、UNION ALL
で実装することを検討してみてください。
SELECT T1.社員コード
FROM 社員マスタ T1
WHERE
T1.年齢 = 20 OR T1.年齢 = 30
--UNION ALLを使う
SELECT T1.社員コード
FROM 社員マスタ T1
WHERE
T1.年齢 = 20
UNION ALL
SELECT T1.社員コード
FROM 社員マスタ T1
WHERE
T1.年齢 = 30
レスポンスについての注意点はSQL チューニングでレスポンス改善に効果のあったポイントにまとめていますので、合わせてご覧ください。