サイトアイコン SE日記

【SQL】インデックスが使用されないケース


ORACLEデータベースのSQLで、インデックスを作成しても利用されない場合をいくつか紹介します。

インデックスの基礎的な内容については↓で紹介していますので参考にしてください。
>>【ORACLE】索引・インデックスとは

インデックスとSQLの例

下記のようなSELECT文が遅い場合に、抽出条件である「div_cd」にインデックスを作成したとします。

このインデックスが使用されないケースを紹介していきます。

--SELECT文の例
select * from table1 a where a.div_cd = '100';

--インデックスの例
CREATE INDEX table1_idx0 ON test01.table1(div_cd) TABLESPACE index_tbs;

インデックスが使用されないケース

LIKEの中間一致検索や後方一致検索、否定形の条件を指定するとインデックスが使用されません。

LIKEの中間一致や後方一致

次のようにLIKEで中間一致検索をした場合、インデックスは使用されません。

select * from table1 a where a.div_cd like '%20%';

LIKEで後方一致検索をした場合も、インデックスは使用されません。

select * from table1 a where a.div_cd like '%50';

否定形の条件

!=や<>などの否定形の条件を指定した場合もインデックスが使用されません。
否定形の条件を使ったSQLのチューニングについては「SQLのチューニング方法【否定形(is not nullなど)】」で解説していますのでぜひ参考にしてください。

--!=の使用
select * from table1 a where a.div_cd != '150';

--<>の使用
select * from table1 a where a.div_cd != '150';

まとめ

LIKEの中間・後方一致検索や否定形の条件を指定するとインデックスは使用されません。

SQLを遅くならないようにするには、書き方を工夫するか、先に他の条件で出来るだけレコードを絞るなどの対応が必要です。

SQLのチューニングについては、「SELECT文のSQLチューニング方法まとめ」で詳しく解説していますので、ぜひ参考にしてください。

モバイルバージョンを終了