Oracle 10gの表領域はほぼ100%使用されています。
サイズ(MB)= 571,768.0使用済み(MB)= 571,534.0
そのテーブルスペースに関連付けられたスキーマに属するテーブル内の何千ものレコードを削除(およびコミット)しました。驚いたことに、Enterprise Managerの「表領域」ページによると、空き領域はありませんでした。
質問:削除されたレコードに対応するスペースをOracleに強制的に解放させるために必要なことはありますか?
alter table {table_name}は、行の移動を有効にします。
テーブル{table_name}の縮小スペースを変更します。
Enterprise Managerで表示しているページは、DBA_DATA_FILES
(表領域に割り当てられたさまざまなファイルの合計サイズを示します)とDBA_SEGMENTS
(合計を示します)を比較することにより、ほぼ確実に空き領域を報告しています。表領域内のオブジェクトに割り当てられたすべてのセグメントのサイズ)。一部のデータを削除したからといって、これが変わることはありません。
データを削除すると、特定のオブジェクトに割り当てられたブロックとエクステント内のスペースが解放されます。したがって、FOOテーブル(および関連するFOOインデックス)から100 MB相当のデータを削除しても、FOOセグメントのサイズは減少しません。しかし、そのセグメントには、FOOへのさらに100MB相当の挿入に対応するスペースがあります。表領域内の他のセグメント用にスペースを解放するためにFOOからスペースを削除する場合は、データを削除した後にFOOを再編成する必要があります。これはやや複雑なプロセスであり、ダウンタイムとかなりのテストが必要になる可能性があります。 。オブジェクトのサイズを恒久的に縮小する場合を除いて、通常はお勧めできません。FOOが最終的にさらに100 MBの挿入を確認する場合、FOOセグメントを縮小して再び拡大することは有益ではありません。
DBMS_SPACEパッケージを使用して、さまざまなセグメントで使用可能なスペースの量を確認できます。これにより、空のブロックと、さまざまな充填状態(0〜25%が満杯、25〜50%が満杯、50〜75%が満杯、75〜100%が満杯)にあるブロックがわかります。データを削除すると、通常、テーブルに割り当てられる空のブロックと部分的に空のブロックの数が増加します。
受け入れられた回答のフォローアップと同様に、セグメントアドバイザを使用して(dbms_advisorの呼び出しを介して)、スペースの縮小操作を実行することによるスペースの節約を見積もることができます。 [セグメントアドバイザーを実行するのにライセンスパックは必要ありません]
そうすれば、時間を節約して、最もメリットが得られるセグメントをターゲットにすることができます。
通常は、create table temp_table name as select * fromtable_you_deleted_from;として一時テーブルを作成することをお勧めします。次に、元のテーブルのインデックスを削除して、そのテーブルを指す制約を無効にし、このテーブルを削除して、create table table_you_deleted_from name as select * fromtemp_table;として再度作成します。インデックスを再作成し、制約を有効にします。
ここでは、基本的にテーブルサイズとインデックスツリーの長さを減らしました。つまり、今後の取得が速くなります。