Oracleデータベースでは、長期間の運用や大量のINSERT・DELETE・UPDATE操作により、表領域に断片化が発生することがあります。断片化が進行すると、無駄なディスク使用やパフォーマンスの低下につながるため、定期的な再編成やオブジェクトの移動による最適化が重要です。
本記事では、表領域の断片化の確認方法から、再編成(REORGANIZE)、オブジェクトの移動による対策手順までを紹介します。
表領域の断片化とは
表領域の断片化とは、データの削除や更新によって空き領域が不規則に分散され、連続した空き領域が確保できなくなる状態を指します。この状態では、新しいデータの格納効率が悪くなり、I/O効率やSQL処理時間に影響が出ることがあります。
断片化の確認方法
表領域の断片化状況を確認するには、次のSQLを使用します。
SELECT tablespace_name,
file_id,
MAX(bytes) / 1024 / 1024 AS max_free_mb
FROM dba_free_space
GROUP BY tablespace_name, file_id
ORDER BY tablespace_name;
このクエリでは、各表領域の中で最大の空き領域(MB)がどれだけ連続して確保できるかを確認できます。値が小さい場合、断片化が進行している可能性があります。
断片化を解消する主な方法
表やインデックスを移動する
最も一般的な方法は、テーブルやインデックスを同じ表領域または別の表領域に移動し直すことです。これにより、オブジェクトが連続領域に再配置され、空き領域の統合が図れます。
-- テーブルの移動
ALTER TABLE テーブル名 MOVE TABLESPACE 表領域名;
-- インデックスの再作成
ALTER INDEX インデックス名 REBUILD TABLESPACE 表領域名;
インデックスはREBUILD
で効率よく再構築できます。テーブルを移動した場合は、関連するインデックスの再作成も忘れずに行いましょう。
表領域を縮小する(SHRINK)
Oracle 10g以降では、一部の表に対してSHRINK SPACE
でスペースを縮小できます。
ALTER TABLE テーブル名 ENABLE ROW MOVEMENT;
ALTER TABLE テーブル名 SHRINK SPACE;
ROW MOVEMENT
を有効にしてから縮小操作を行う必要があります。ただし、主キーや外部キー制約がある場合は注意が必要です。
注意点とベストプラクティス
断片化解消作業を行う際は、以下の点に注意してください。
- オブジェクト移動中は該当テーブルがロックされるため、業務時間外での実行が望ましい
- パーティションテーブルやLOBを含むテーブルの移動は追加のオプションが必要
- 移動後に統計情報(ANALYZEまたはDBMS_STATS)を再収集しておくこと
まとめ
表領域の断片化は、パフォーマンス低下やストレージ効率悪化の原因になります。定期的に断片化状況を確認し、オブジェクトの再編成や移動によって健全なストレージ状態を保つことが、安定運用の鍵となります。
本番環境での再編成は業務影響を考慮し、リスクを抑えながら計画的に実行しましょう。