首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 大表高效刪除策略:TRUNCATE + DEALLOCATE 分批釋放空間

     編輯:Oracle 資料庫基礎

問題背景

直接 DROP TABLE 大表會佔用大量 CPU、耗時數天,且中斷後 SMON 會持續清理臨時段,無法控制。

解決方案:兩階段釋放

  1. TRUNCATE TABLE ... REUSE STORAGE
    保留 High Water Mark 在 Segment Header,極快完成,不回收 Extent。
  2. ALTER TABLE ... DEALLOCATE UNUSED KEEP <size> 分批回收 Extent
    逐夜釋放空間,降低 CPU 衝擊。

實例:2 GB 大表 BIGTAB,6 晚完成

-- 第 1 步:截斷保留儲存
TRUNCATE TABLE BIGTAB REUSE STORAGE;

-- 第 2 步:每晚釋放 1/3 GB (約 341 MB)
Night 1: ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1707M;  -- 保留 2G*5/6
Night 2: ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1365M;  -- 保留 2G*4/6
Night 3: ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1024M;  -- 保留 2G*3/6
Night 4: ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 683M;   -- 保留 2G*2/6
Night 5: ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 341M;   -- 保留 2G*1/6
Night 6: DROP TABLE BIGTAB;  -- 最後直接 Drop

LOB Segment 同樣適用

ALTER TABLE ... MODIFY LOB (<lob_column>>)
DEALLOCATE UNUSED KEEP <size>M;

注意事項

  • 若已執行 DROP TABLE,此法無效 (Segment 已轉為臨時段,SMON 接管清理)
  • 僅適用 Table Segment,不適用 Index/Cluster 等其他段類型
  • 需預先評估表大小,規劃每晚釋放量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved