Oracle DBのテーブルに大量のデータのinsert/deleteを繰り返すとデータ量が少ないのにレスポンスが極端に悪くなることがある
大量のデータをinsertすると、HWM(ハイウォーターマーク(データがここの位置まであるという場所を指し示すポインタ))の位置が上がる
このHWM(ハイウォーターマーク)はdelete文では下がらない
データ検索(select)するときにテーブルの先頭からHWMまでが検索対象となるため
大量のデータinsertによって、HWMが上がりOracleが検索対象とする範囲が広がって
delete文ではHWMが下がらないため、データ量には関係なく検索する範囲だけ広がるという状態になってしまう
HWMを下げるには
・delete文ではなくtruncateを使う
・テーブルをdropして、再度create tableする
テーブルのHWMによるパフォーマンスと領域無駄遣いを解決するためには
1.
今のテーブルを新しいセグメントに複製して既存のセグメントを破棄
ALTER TABLE table_name MOVE [ ONLINE ];
2.
再配置(コピーと削除)による断片化の解消
移動の対象となれば解消されるがすべて解消されるわけではない
ハイウォータマークを下げることはできるが万能ではない
ALTER TABLE fragment_table SHRINK SPACE [ COMPACT ] [ CASCADE ];
COMPACTはデフラグ(レコード再配置)のみで
ハイウォータマークエクステントの解放は行わない
処理を2回に分けたい場合などにも使う(領域解放は SHRINK SPACE)
CASCADEは依存するオブジェクトもSHRINKする