ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

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;
  1. 使用するための前提
    1. 表領域が ローカル管理表領域、自動セグメント領域管理 であること
    2. LONG 列を含まないこと
    3. クラスタ化表でないこと
    4. 圧縮表でないこと
  2. セグメントの縮小ができないケース
    1. ファンクション索引、ビットマップ結合索引を使用している場合
    2. ON COMMIT マテリアライズド・ビューのマスター表の場合
  3. その他
    1. ROWID が変更されるため ROWID マテリアライズド・ビューは再構築しないと整合性が合わなくなる。

参考:http://www.shift-the-oracle.com/inside/alter-table-move-or-shrink.html