Tihiroの頭を休めるIT教室

少しだけ頭使って後は根性

Oracleでインデックスの断片率を確認と再構築について。

概要

いつもはPostgreSQLですが、今回はOracleです。 タイトルの通り、インデックスの断片率を確認する方法と、インデックスを再構築する方法です。

インデックスを適用しているのにSELECT文が遅いなってときに確認します。大抵はインデックスに問題なかったりするんですが、確認する方法を知っておいて損はないです。

環境は

  • Oracle11g

です。

事前準備

インデックスの状態は統計情報から取得しているようですので、事前に統計情報を最新にする必要があります。

インデックス名を確認する

まずは対象となるインデックスの名前を特定することから始めます。下記SELECT文のWHERE句にテーブル名を指定すると、該当テーブルに設定されているインデックスを取得することができます。

SELECT
  * 
FROM
  user_indexes
WHERE
  table_name = 'テーブル名'

統計情報を最新にする

インデックス名が分かったら、統計情報を更新します。

ANALYZE INDEX インデックス名 VALIDATE STRUCTURE

作業開始!

断片率を確認する

事前準備が完了致しましたら、次のSELECT文で断片率を確認します。

SELECT * FROM user_indexes WHERE table_name = 'テーブル名';
ANALYZE INDEX PK_材料マスタ VALIDATE STRUCTURE;
SELECT
    name AS "インデックス名"
  , height AS "インデックスの深さ"
  , lf_rows AS "リーフ行の数"
  , del_lf_rows  AS "削除されたリーフ行の数"
  , del_lf_rows / lf_rows AS "断片率"
FROM
  index_stats
WHERE
  name = 'インデックス名'

という感じです。

断片率が0.2以上、またはインデックスの深さが4以上になると、再構築した方がよいという話みたいですね。

インデックスの再構築

インデックスの再構築は

DROP INDEX インデックス名;
CREATE INDEX インデックス名 ON テーブル名(カラム名...) TABLESPACE 表領域名;

ALTER INDEX インデックス名 REBUILD;

で、再構築されます。

まとめ

簡単ですが、Oracle11gでのインデックスの断片率を確認する方法と、インデックスを再構築する方法でした。

PostgreSQLでの方法についても記事にしてみたいと思います。