テーブルのハイウォータマーク操作

テーブルのハイウォータマークによるパフォーマンスと領域の無駄遣いの問題の解決するためには、2つの手段がある。 表の移動による再構築と、フラグメント解消後の縮退操作である。

テーブルの移動による再作成

今のテーブルを新しいセグメントに複製し、既存のセグメントを破棄する。
このとき、再作成先のテーブルスペースに再構築するだけの空き領域、更新操作を制限するテーブルの排他ロックが必要とされる。

ALTER TABLE rebuild_table MOVE [ ONLINE ] ;

(注意) LONG / LONG RAW のある表は移動できない
索引構成表のみ ONLINE 実行ができる。(パラレルクエリーは不可)

SHRINK SPACE による断片化の解消

  • 行断片 の再配置(コピーと削除)による 断片化 の解消
  • 行移行したデータが移動の対象となれば行移行は解消されるが、行移行がすべて解消されるわけではない。
  • 行ロックのため ONLINE 実行が可能
  • ハイウォータマークを下げることはできるが万能ではない。(※) (Oracle 10g 時点)

(※) レコード数が少ない場合において HWM が思ったより低下しない場合がある。 これは 行移行行連鎖 の状態によって使用中のブロックが残っていることが考えられる。 連鎖状態を解消してから行なうと非常に効果が高い。

[ ALTER TABLE fragment_table ENABLE ROW MOVEMENT ; ]
ALTER TABLE fragment_table SHRINK SPACE [ COMPACT ] [ CASCADE ] ;
[ ALTER TABLE fragment_table DISABLE ROW MOVEMENT ;]

(注意) ローカル管理表領域自動セグメント領域管理 の場合のみ実行ができる。

COMPACT は デフラグ(レコードの再配置)のみでハイウォータマークの上位領域のエクステントの解放は行わない。
処理を 2回に分けたい場合などにも使う (領域解放は SHRINK SPACE)
CASCADE は依存するブジェクトも SHRINKする。

レコードの再配置とエクステント解放の動作イメージ)

SHRINK の動作イメージ

インデックスの再構築、断片化の解消

インデックスの再構築 (ONLINE での実行が可能 ※)

ALTER INDEX rebuild_index REBUILD [COMPUTE STATISTICS];

空き領域の結合

ALTER INDEX fragment_index SHRINK SPACE COMPACT ;
または
ALTER INDEX fragment_index COALESCE;

(※) ONLINE を指定したインデックスの再構築時には基本的に DMLをブロッキングするロックは発生しない。但し、最終フェーズで短時間ブロックされる。
Oracle 11g において ONLINE 実行の最終フェーズで発生していた DMLブロッキング・ロック が不要になっている。



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー