インデックスはテーブルの再作成などの影響で削除される。
また、再作成してもUNUSABLEのステータスとなって名前の通り使用できなくなる模様。(必ずかは不明)
実行計画立てる際にUSUSABLEのIndexを使用しようとしてエラーを吐くとかはなく、使わず実行計画を立てる。
なので影響が大きくない場合は気づかないかもしれない。
ALTER INDEX [Index名] REBUILD;
とするとVALIDのステータスとなり使用可能になる。
今回気づいた経緯は、
・バッチが異常に遅くなった
→調べると SQLが遅い
→別の環境では早い
→実行計画見直す
→Indexが遅い環境では動いてない
→ヒント句でIndex強制使用
→java.sql.SQLException: ORA-01502: 索引'[索引名]'またはそのパーティションが使用不可の状態です。
→ select index_name, status from all_indexes where index_name = '[索引名]';
→UNUSABLE だった!
Index 作り直すだけで大丈夫なんだと思ってました。