Oracle 10 g - 表領域のスペースを解放できません

Oracle 10 g - 表領域のスペースを解放できません

Oracle 10g の表領域はほぼ 100% 使用されています。

サイズ (MB) = 571,768.0 使用済み (MB) = 571,534.0

その表領域に関連付けられたスキーマに属するテーブル内の数千のレコードを削除 (およびコミット) しました。驚いたことに、Enterprise Manager の [表領域] ページによると、領域は解放されていませんでした。

質問: 削除されたレコードに対応する領域を Oracle に強制的に解放させるために必要なことはありますか?

答え1

テーブル {table_name} を変更して行の移動を有効にします。

テーブル {table_name} を変更してスペースを縮小します。

答え2

Enterprise Manager で表示されているページは、ほぼ間違いなく、DBA_DATA_FILES(表領域に割り当てられたさまざまなファイルの合計サイズを示します) とDBA_SEGMENTS(表領域内のオブジェクトに割り当てられたすべてのセグメントの合計サイズを示します) を比較して空き領域を報告しています。これは、一部のデータを削除しただけでは変わりません。

データを削除すると、特定のオブジェクトに割り当てられたブロックとエクステント内の領域が解放されます。したがって、FOO テーブル (および関連する FOO インデックス) から 100 MB 相当のデータを削除しても、FOO セグメントのサイズは減少しません。ただし、そのセグメントには、FOO への 100 MB 相当の挿入を収容できる領域が確保されます。テーブルスペース内の他のセグメントの領域を解放するために FOO から領域を削除する場合は、データを削除した後に FOO を再編成する必要があります。これは、ダウンタイムとかなりのテストが必要になる可能性のある、やや複雑なプロセスです。オブジェクトのサイズを永続的に縮小するのでない限り、通常はお勧めできません。FOO に最終的に 100 MB の挿入が追加される予定である場合、FOO セグメントを縮小しても再び大きくなるだけなので、メリットはありません。

DBMS_SPACE パッケージを使用すると、さまざまなセグメントで使用可能なスペースの量を確認できます。これにより、空のブロックと、さまざまな充填状態 (0 ~ 25% 充填、25 ~ 50% 充填、50 ~ 75% 充填、75 ~ 100% 充填) のブロックがわかります。データを削除すると、通常、テーブルに割り当てられている空のブロックと部分的に空のブロックの数が増加します。

答え3

受け入れられた回答の続きとして、セグメント アドバイザー (dbms_advisor の呼び出し経由) を使用して、スペース縮小操作の実行によるスペース節約量を見積もることができます。[セグメント アドバイザーを実行するためにライセンス パックは必要ありません]

そうすれば、時間を節約し、最も利益が得られるセグメントだけをターゲットにすることができます。

答え4

通常は、create table temp_table name as select * from table_you_deleted_from; として一時テーブルを作成し、次に元のテーブルのインデックスを削除して、そのテーブルを指す制約を無効にしてから、このテーブルを削除して再度作成し、create table table_you_deleted_from name as select * from temp_table; としてインデックスを再作成し、制約を有効にするのが適切です。

ここでは基本的にテーブル サイズとインデックス ツリーの長さが削減され、今後の検索が高速化されます。

関連情報