はじめに
- 何かテーブルにSQL投げたのに返ってこないみたいな時は、テーブルのインデックスが断片化してるかも
- 大量件数の削除、投入を繰り返していると起きやすいかも
- インデックス断片化時の対処について備忘用に書く
インデックスの断片化対処の手順
- 調査したいテーブルのインデックス一覧を取得
select index_name from user_ind_columns where table_name = '調査したいテーブル名' order by index_name;
- インデックスの統計情報を更新
analyze index 調査したいテーブル名 validate structure;
- インデックスの統計情報を更新
select name, height, lf_rows, del_lf_rows from index_stats WHERE name = '調査したいインデックス名';
実行結果例
NAME HEIGHT LF_ROWS DEL_LF_ROWS
---------------------------- ---------- ---------- -----------
調査したいインデックス名 1 21 0
height・・・インデックスの深さ
lf_rows・・・リーフ行の数
del_lf_rows・・・削除されたリーフ行の数
- 断片率はdel_lf_rows / lf_rowsで計算できるよ
インデックスの再構築
- 断片化がやばそうならインデックス再構築する
alter index 再構築したいインデックス名 rebuild;