ゆとりずむ

東京で働く意識低い系ITコンサル(見習)。金融、時事、節約、会計等々のネタを呟きます。

Oracleで肥大化したIndexのサイズを小さくする方法

ちょっと、仕事中にやってて気になったのでメモ。
なお、記載内容に誤りがあった場合、責任はとれないので自己責任でお願いします。

Oracleにて、Indexは対象としているテーブルのレコード数の増加に加えて、Delete/Update等を繰り返すことによっても肥大化していく。
Indexのサイズの肥大化は、

  • 検索等の処理速度の劣化
  • ディスク空き領域の不足

に繋がる。ここで、下記のコマンドでIndexのリビルドを行うとインデックスを再編成し、検索時の処理速度を早くすることが出来る。

alter index flagment_index_name rebuild

ただし、これはIndexの再編成を行っただけで、領域の開放はできていない。イメージでいうと、中途半端に水の入ったコップが3つあって、ひとつのコップにまとめることはできたけれど、コップそのものの数は減らせていない状態・・・。といえば分かりやすい?
領域(エクステント)の開放まで行うためには、Drop and Create Indexをやれば確実だけれども、そこまでしなくてもmove句をつけてやればOK。

alter index flagment_index_name rebuild move storage(initial 8k)

initialのところは、そのindexの領域として最低限確保する領域を記載しておくんだけれども、何も分からなければ恐らくblockサイズでOK。
なお、indexをrebuildする際は、Enterprise Edition 専用の online句がつけられない場合、再編成中はテーブルロックされるため、selectしかできなくなるので要注意。