TABLEサイズを縮小する
ALTER ~ SHRINK SPACE
セグメントを縮小するコマンド
行移動・行連鎖による断片化を解決してから実行するのが望ましい
Oracle10gからの機能
declare W_TBL_nm varchar2(100); cursor CUR1 is select table_name from user_tables; begin open CUR1; loop fetch CUR1 into W_TBL_NM; exit when CUR1%notfound; dbms_output.PUT_LINE(W_TBL_NM || 'TABLE SHRINKING…'); execute immediate 'alter table ' || W_TBL_NM || ' enable row movement'; execute immediate 'alter table ' || W_TBL_NM || ' shrink space'; execute immediate 'alter table ' || W_TBL_NM || ' disable row movement'; exec dbms_stats.GATHER_TABLE_STATS('orcl', W_TABLE_NM); end loop; close CUR1; end;
- 使用するための前提
- 表領域が ローカル管理表領域、自動セグメント領域管理 であること
- LONG 列を含まないこと
- クラスタ化表でないこと
- 圧縮表でないこと
- セグメントの縮小ができないケース
- ファンクション索引、ビットマップ結合索引を使用している場合
- ON COMMIT マテリアライズド・ビューのマスター表の場合
- その他
- ROWID が変更されるため ROWID マテリアライズド・ビューは再構築しないと整合性が合わなくなる。
参考:http://www.shift-the-oracle.com/inside/alter-table-move-or-shrink.html