【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チューニング方法まとめ