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

Oracle TRUNCATE、DELETE、DROP 三大刪除操作深度對比

     編輯:Oracle 資料庫基礎

核心差異一覽表

維度TRUNCATEDELETE (無 WHERE)DROP
語句類型DDLDMLDDL
刪除範圍全表數據全表數據表結構+數據+依賴對象
可回滾否(隱式提交)是(需 COMMIT/ROLLBACK)否
觸發器不觸發觸發 FOR EACH ROW/STATEMENT不觸發
高水位線 (HWM)重置到初始位置不變釋放空間,對象消失
空間釋放默認釋放到 MINEXTENTS,REUSE STORAGE 保留不釋放完全釋放
速度極快(元數據操作)慢(逐行生成 REDO/UNDO)最快(僅字典操作)
外鍵約束被引用時不可執行受約束檢查級聯刪除約束
權限要求DROP ANY TABLE 或表擁有者DELETE 權限DROP ANY TABLE 或表擁有者

場景選型指南

✅ 使用 DELETE

  • 需刪除**部分行**(帶 WHERE)。
  • 需觸發觸發器(審計、同步邏輯)。
  • 在事務中需回滾能力。
  • 表較小或有索引維護成本可接受。

✅ 使用 TRUNCATE

  • 清空**整表數據**,無事務回滾需求。
  • 重置 HWM,釋放空間(或 `REUSE STORAGE` 保留空間供下次載入)。
  • 大表清空、數據重載、分區截斷(`TRUNCATE PARTITION`)。
  • 注意:被外鍵引用的父表不可直接 TRUNCATE,需先 `DISABLE` 約束。

✅ 使用 DROP

  • 永久移除表結構、索引、約束、權限、觸發器等所有依賴對象。
  • 表結構變更重建、測試環境清理、臨時表生命周期結束。
  • 慎用:無回滾,無閃回表(除非啟用 Recyclebin 且 `PURGE` 未指定)。

進階細節

1. TRUNCATE 與 HWM

全表掃描讀取到 HWM 以下塊。大量刪除後 HWM 不下降,導致後續全掃性能差。`TRUNCATE` 或 `ALTER TABLE ... MOVE` + `SHRINK SPACE` 可重置 HWM。

2. DELETE 大表性能優化

-- 分批提交,避免 UNDO 爆滿、鎖升級
LOOP
  DELETE FROM big_table WHERE create_dt < :cutoff AND ROWNUM <= 10000;
  EXIT WHEN SQL%ROWCOUNT = 0;
  COMMIT;
END LOOP;

3. DROP 後的閃回恢復(10g+)

-- 未 PURGE 時可恢復
FLASHBACK TABLE dropped_table TO BEFORE DROP;
-- 查看回收站
SELECT * FROM RECYCLEBIN;

安全警示

⚠️ **生產環境嚴禁無備份直接 DROP/TRUNCATE**。建議:

  1. 建立「變更單」流程,審批後執行。
  2. 執行前導出元數據(`DBMS_METADATA.GET_DDL`)與關鍵數據樣本。
  3. 啟用 Recyclebin(`RECYCLEBIN=ON`)作為最後防線。

理解三者在存儲、事務、觸發器、HWM 等維度的本質差異,是數據庫開發與運維的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved