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


ここではORACLEデータベースで、テーブルの断片化を解消する方法を紹介しています。

表の断片化以外にもSQLが遅くなる原因があります。詳しくは↓で紹介していますので参考にしてください。
>>SQLが突然遅くなる原因と対応方法

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

表の断片化を解消する3つの方法を紹介します。
 1.表をエクスポート・インポートする
 2.ALTER TABLE MOVEによる再構築
 3.オンライン表再定義
以上の3つです。

以降でもう少し詳しく紹介していきます。

1.表をエクスポート・インポートする

表をエクスポートしてインポートすることで断片化を解消することが出来ます。

エクスポートにはexpdp、インポートにはimpdpを使います。

次のコマンドは表単位にエクスポート・インポートしています。

・表単位にエクスポートする方法
expdp user1/password dumpfile=dmp_dir:expdat_tb.dmp tables=EMP

・表単位にインポートする方法
impdp user1/password dumpfile=dmp_dir:expdat_tb.dmp tables=EMP TABLE_EXISTS_ACTION=REPLACE

エクスポート・インポートについて詳しくは↓で紹介していますので参考にしてください。
>>【ORACLE】エクスポート・インポートする方法

2.ALTER TABLE MOVEによる再構築

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;

まとめ

表の断片化を解消する3つの方法を紹介します。
 1.表をエクスポート・インポートする
 2.ALTER TABLE MOVEによる再構築
 3.オンライン表再定義

SQLのチューニング方法は↓で紹介していますので参考にしてください。
>>SELECT文のSQLチューニング方法まとめ