Oracle 10 g - 無法釋放表空間中的空間

Oracle 10 g - 無法釋放表空間中的空間

Oracle 10g中的表空間幾乎100%被使用。

大小 (MB) = 571,768.0 已使用 (MB) = 571,534.0

我剛剛刪除(並提交)了一個表中的數千筆記錄,該表屬於與該表空間關聯的模式。令人驚訝的是,根據企業管理器上的「表空間」頁面,沒有釋放任何空間。

問題:我需要做些什麼來強制Oracle釋放與已刪除記錄對應的空間嗎?

答案1

alter table {table_name} 啟用行移動;

alter table {table_name} 縮空間;

答案2

您在企業管理器中查看的頁面幾乎肯定會透過比較DBA_DATA_FILES(它告訴您分配給表空間的各種文件的總大小)與DBA_SEGMENTS(它告訴您分配給表空間中物件的所有段的總大小)來報告可用空間。這不會僅僅因為您刪除了一些資料而改變。

刪除資料時,會釋放分配給特定物件的區塊和範圍內的空間。因此,如果從 FOO 表(以及關聯的 FOO 索引)中刪除 100 MB 的數據,FOO 段的大小不會減少。但現在該段將有空間可容納另外 100 MB 的 FOO 插入內容。如果您要從 FOO 中刪除空間,以便為表空間中的其他段釋放空間,則需要在刪除資料後重新組織 FOO——這是一個有點複雜的過程,可能需要停機以及進行大量測試。除非您永久地減少物件的大小,否則通常不建議這樣做 - 如果 FOO 最終將看到另外 100 MB 的插入,則僅縮小 FOO 段以使其再次增長是沒有好處的。

您可以使用 DBMS_SPACE 套件來查看不同區段中有多少可用空間。這將告訴您空區塊以及處於各種填充狀態的區塊(0-25% 已滿、25-50% 已滿、50-75% 已滿和 75-100% 已滿)。當刪除資料時,通常會導致分配給表的空塊和部分空塊的數量增加。

答案3

如同已接受答案的後續,您可以使用 Segment Advisor(透過呼叫 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;重新建立索引並啟用指標。

在這裡,您基本上減少了表格大小和索引樹長度,即未來檢索速度更快。

相關內容