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

在oracle中因爲表結構設計不合理或者須要清楚老數據的時候,常常須要對大表數據進行清理。sql

通常有一下幾種方法:oracle

     1. 刪除大部分數據,留下小部分數據。咱們能夠把須要保留的數據轉移到別的表,而後再把大表drop掉,而後更名就好了;spa

          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的方式。table

         a) 咱們能夠先用delete from tablename_max;class

         b) 因爲咱們進行了數據的delete 因此形成了 tablename_max 這張表的數據稀疏,數據塊並無減小,hwm也沒有減小,這樣就會影響全表掃描須要訪問更多的數據塊。這時咱們能夠經過shrink來重組數據使數據分佈更緊密,同時下降HWM釋放空閒數據塊。select

        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表空間也會暴增。

相關文章
相關標籤/搜索