Oracle - 大きなテーブル削除
[Problem]
多数のエクステントを持つテーブルをDropすると、Dropを実行したユーザ・プロセス
が大量のCPUが消費して、処理がなかなか終了しません。
これは、基本的にDropコマンドの処理中でエクステントに対する操作で大量のCPUが
必要となるためです。
[Action]
1. REUSE STORAGE句を使用して、該当テーブルをtruncateします。
このコマンドを実行すると、エクステントを解放せずに HWM のみがテーブルの
ヘッダー・ブロックまで下がるため、このコマンドは直ぐに終了します。
2. KEEP句を使用して段階的に未使用のエクステントを解放していきます。
このとき、解放せずに残す領域のサイズを指定することで、そのコマンド実行時に
どの程度のエクステントを解放するかを制御することができます。
例:
1. REUSE STORAGE句を使用してBIGTABをtruncateします。
SQL> TRUNCATE TABLE BIGTAB REUSE STORAGE;
2. KEEP句を使用して段階的にエクステントを解放します。
1日目の夜:
SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1707M; (2Gbの5/6)
2日目の夜:
SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1365M; (2Gbの4/6)
3日目の夜:
SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1024M; (2Gbの3/6)
4日目の夜:
SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 683M; (2Gbの2/6)
5日目の夜:
SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 341M; (2Gbの1/6)
6日目の夜:
SQL> DROP TABLE BIGTAB;