Oracleで作業していて肥大化したテーブルの割り出しと、テーブルの最適化を行う方法をとりあえずメモ書き。
各テーブルサイズの取得
以下のSQLでテーブル名、テーブルサイズを取得してどのテーブルを最適化するか判断。
SELECT
a.table_name AS "テーブル名称"
,a.num_rows AS "レコード数"
, b.MB AS "容量(MB)"
FROM user_tables a
, (Select Segment_Name,Sum(bytes)/1024/1024 MB From user_segments Group By Segment_Name) b
WHERE a.table_name = b.Segment_Name
ORDER BY a.num_rows desc, b.MB desc;
テーブルの行移動を有効にする
以下のSQLを使ってテーブルの行移動を有効にする。すでに行移動が有効になっている場合には必要ない。
ALTER TABLE "テーブル名" ENABLE ROW MOVEMENT;
テーブルの縮小を行う
以下のSQLを使ってテーブルの縮小を行う。
CASCADEは関連するインデックスのサイズの縮小まで行う。COMPACTにも切り替えができるが、こちらはセグメントデータの再構成のみ行う。
ALTER TABLE "テーブル名" SHRINK SPACE CASCADE;
補足
一先ずメモ書き程度にまとめ。
追々記述を追加するかも。