表の断片化を解消する3つの方法

 テーブルの断片化解消の方法をメモしておきます。

1.exp/imp

  ※オプションによって様々な範囲でexp/imp可能です。

  ・exp user1/pass
  ・imp user1/pass


2.ALTER TABLE MOVEによる再構築

  コマンドとしては一番簡単です。
  ・テーブルのみ再構築

   ALTER TABLE table1 MOVE;



  ・パーティション表の場合

   ALTER TABLE table1 MOVE PARTITION;



  ・INDEXも同時に再構築する場合

   ALTER TABLE table1 MOVEUPDATE INDEXES;”



  ・オンラインで実行する場合 ※12cから

   ALTER TABLE table1 MOVE ONLINE;


 3.オンライン表再定義

  手間がかかりますが、11gでもオンラインメンテナンスが可能です。コマンド実行中にINSERTやUPDATEを実行しましたが問題ありませんでした。しかし、実行している実績がなく、結局、本番環境では使いませんでした。※VPDを利用している場合は実行できません。※12cからはパラメータを追加することでVPDを利用していても実行できます。
 ・事前準備
  断片化解消したいテーブルと同じ構造の仮テーブルを用意しておきます。
 ・初期処理

  begin
    DBMS_REDEFINITION.START_REDEF_TABLE(
     uname=>’user1′
     ,orig_table=>’table1′
     ,int_table=>’table1_KARI’
     ,options_flag=>dbms_redefinition.cons_use_pk
    );
   end;



 ・仮テーブルへのコピー処理

   declare
    num_errors PLS_INTEGER;
   begin
    DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
     uname=>’user1′
     ,orig_table=>’table1′
     ,int_table=>’table1_KARI’
     ,copy_indexes=>dbms_redefinition.cons_orig_params
     ,num_errors=>num_errors);
   end;



 ・仮テーブルと本テーブルを入れ替え

   begin
    DBMS_REDEFINITION.FINISH_REDEF_TABLE(
     uname=>’user1′
     ,orig_table=>’table1′
     ,int_table=>’table1_KARI’);
   end;



 ・元々本テーブルだったものを削除

   drop table table1_KARI;