読者です 読者をやめる 読者になる 読者になる

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


OracleでBツリーインデックスの高さ(深さ)を確認する

f:id:replication:20140709013139j:plain
photo credit: blmiers2 via photopin cc

はじめに

Oracleのインデックスは通常Bツリーと呼ばれる二分木で管理されます。レコードが削除されると、Bツリーの高さが高くなり、レコードのへのアクセス効率が悪くなります。

プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)
アシスト教育部
SBクリエイティブ
売り上げランキング: 11,963

B-Tree 索引(インデックス)は、B-Tree のレベル数(ルート・ブロックからリーフ・ブロックまでの階層)が高くなるとアクセス効率が低下します。
データの削除が多く行われるとブロックの使用効率が低下して B-Tree のレベル数が高くなります。
その場合は索引を再構築(REBUILD)する必要があります。
索引(インデックス)の断片化の確認方法と対処方法 (オラクルエンジニア通信 - 技術資料、マニュアル、セミナー) はてなブックマーク - 索引(インデックス)の断片化の確認方法と対処方法 (オラクルエンジニア通信 - 技術資料、マニュアル、セミナー)

インデックスのBツリーの高さを知る

Bツリーの高さを調べるには、以下のコマンドをsysユーザで実行します。

conn sys/oracle as sysdba
ANALYZE INDEX test_idx VALIDATE STRUCTURE;
SELECT name, height, lf_rows, del_lf_rows, del_lf_rows/lf_rows FROM index_stats;
name インデックス名
height Bツリーの高さ
lf_rows リーフの行数
del_lf_rows 削除されたリーフの行数
del_lf_rows/lf_rows 削除されたリーフの行数÷リーフの行数

f:id:replication:20140709014044p:plain

インデックスの再構築が必要か否か

HEIGHT が4以上で DEL_LF_ROW/LF_ROWS が0.2を超える場合は効率が悪いです。
索引の再構築を行うことを検討して下さい。
索引(インデックス)の断片化の確認方法と対処方法 (オラクルエンジニア通信 - 技術資料、マニュアル、セミナー) はてなブックマーク - 索引(インデックス)の断片化の確認方法と対処方法 (オラクルエンジニア通信 - 技術資料、マニュアル、セミナー)