1. 程式人生 > >oracle 大表刪除數據後,回收空間的問題

oracle 大表刪除數據後,回收空間的問題

轉載 get 分數 數據 utm wid 除了 cascade 減少

轉載一篇文章,關於Oracle數據庫表刪除數據後,釋放空間的問題,原文地址:https://blog.csdn.net/lenovouser/article/details/53422773,內容如下:

在oracle中由於表結構設計不合理或者需要清楚老數據的時候,經常需要對大表數據進行清理。

一般有一下幾種方法:

1. 刪除大部分數據,留下小部分數據。我們可以把需要保留的數據轉移到別的表,然後再把大表drop掉,然後改名就行了;

a) create table tablename_min as select * from tablename_max a where 需要保留的數據.

b) drop table tablename_max ;

c) rename tablename_min as tablename_max ;

這樣就能清除這個大表的hwm,而且釋放掉其他空間。
2.當刪除的數據只是一小部分數據的話,第一種方法就不適用了。比如 3億條數據,你刪除一億條數據的話,用1就不合適。

這時我們就應該考慮使用shrink table的方式。

a) 我們可以先用delete from tablename_max;

b) 由於我們進行了數據的delete 所以造成了 tablename_max 這張表的數據稀疏,數據塊並沒有減少,hwm也沒有減少,這樣就會影響全表掃描需要訪問更多的數據塊。這時我們可以通過shrink來重組數據使數據分布更緊密,同時降低HWM釋放空閑數據塊。

c)由於需要移動行數據,數據的rowid會發生變化,所以需要設置表的row movement屬性:
alter table tablename_max enable row movement; --開啟行遷移功能。
alter table tablename_max shrink space compact;--(可以在壓縮期間進行DML操作和查詢) ,收縮表,不會降低hwm
alter table tablename_max shrink space; --( 調整HWM時將阻塞DML操作),收縮表,並且降低hwm

alter table tablename_max shrink space cascade;--收縮表並降低hwm,並且回收相應的索引。

由於我們刪除了大量的數據 ,相應的索引也進行了刪除,這時需要對索引進行收縮。

alter index idxname shrink space;
註意:shrink table只會針對assm(自動段空間管理)的表有用,否則會報: ORA-10635: Invalid segment or tablespace type。

alter table tablename_max enable row movement語句會造成引用表tablename_max的對象(如存儲過程、包、視圖等)變為無效。執行完成後,最好執行一下utlrp.sql來編譯無效的對象。


由於是通過DML操作進行的,會產生大量redo,註意archivelog目錄的空間大小問題;同時undo表空間也會暴增。

--------------------- 本文來自 lenovouser 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/lenovouser/article/details/53422773?utm_source=copy

oracle 大表刪除數據後,回收空間的問題