liguofeng29’s blog

個人勉強用ブログだっす。

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;