kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

インデックスのshrinkとrebuildの違いを検証

ANALYZE INDEX VALIDATE STRUCTUREでインデックス情報を取得し違いをさくっと検証した。
注意:ANALYZE INDEX VALIDATE STRUCTURE 実行中のDML処理は、ANALYZEによるロックが開放されるまで待機してしまう。

現在のインデックスの状態

SQL> analyze index TEST_IDX  validate structure;
索引が分析されました。

SQL> select NAME, HEIGHT, LF_ROWS, DEL_LF_ROWS from INDEX_STATS;

NAME              HEIGHT    LF_ROWS DEL_LF_ROWS
------------- ---------- ---------- -----------
TEST_IDX               4   34744558      115444
カラム 説明
HEIGHT Bツリーの高さ 4
LF_ROWS リーフ行の数(索引内の値) 34744558
DEL_LF_ROWS 索引内の削除されたリーフ行の数 115444

shrinkの場合

SQL> alter index TEST_IDX shrink space;

索引が変更されました。

SQL> select NAME, HEIGHT, LF_ROWS, DEL_LF_ROWS from INDEX_STATS;

NAME              HEIGHT    LF_ROWS DEL_LF_ROWS
------------- ---------- ---------- -----------
TEST_IDX               4   34629374         260

rebuildの場合

SQL> alter index TEST_IDX rebuild;

索引が変更されました。

SQL> select NAME, HEIGHT, LF_ROWS, DEL_LF_ROWS from INDEX_STATS;

NAME              HEIGHT    LF_ROWS DEL_LF_ROWS
------------- ---------- ---------- -----------
TEST_IDX               3   34629374           0

まとめ

カラム 初期 shrink rebuid
HEIGHT 4 4 3
LF_ROWS 34744558 34629374 34629374
DEL_LF_ROWS 115444 260 0

shrinkの場合はDEL_LF_ROWS(論理削除済みの断片化されたインデックスデータ)をある程度削除する。
rebuildの場合はHEIGHT(B-treeの深さ)を改善しとDEL_LF_ROWSを完全削除する。インデックスが再作成される。