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