在 Oracle 11g 中,DROP
、TRUNCATE
?和?DELETE
?是三種不同的數據清理操作,它們的底層原理和適用場景有顯著差異
1.?DELETE
?的原理
類型:DML(數據操作語言)
功能:逐行刪除表中符合條件的數據,保留表結構。
原理:
-
逐行操作:逐行標記刪除,記錄每行的刪除操作到?undo 段(支持回滾)。
-
事務性:需顯式提交(
COMMIT
)或回滾(ROLLBACK
),未提交前數據可恢復。 -
高水位線(HWM):不降低表的 HWM,已刪除數據占用的空間仍被表保留,后續插入可能重用這些空間。
-
觸發器觸發:會觸發?
BEFORE DELETE
?和?AFTER DELETE
?觸發器。
DELETE FROM employees WHERE department_id = 10; ?-- 刪除部門 10 的員工
ROLLBACK; ?-- 可回滾
適用場景:
-
刪除部分數據(帶?
WHERE
?條件)。 -
需要事務控制或觸發器的場景。
注意事項:
-
性能問題:刪除大量數據時生成大量?undo 日志?和?redo 日志,可能導致性能瓶頸。
-
空間未釋放:表占用的存儲空間不會立即釋放。
2.?TRUNCATE
?的原理
類型:DDL(數據定義語言)
功能:快速刪除表中所有數據,保留表結構。
原理:
-
段級操作:直接釋放表的?數據段(刪除所有數據頁),重置 HWM 為初始值。
-
非事務性:隱式提交,不可回滾(執行后立即生效)。
-
不記錄日志:僅記錄少量元數據操作日志(不記錄每行刪除的 undo/redo 日志)。
-
不觸發觸發器:不會觸發任何?
DELETE
?觸發器。
TRUNCATE TABLE employees; ?-- 清空表數據
適用場景:
-
快速清空大表所有數據。
-
需要釋放表占用的存儲空間。
注意事項:
-
權限要求:需要?
DROP ANY TABLE
?權限。 -
無法恢復:數據無法通過回滾恢復,需依賴備份。
-
外鍵約束:若表是其他表的外鍵父表,需先禁用外鍵約束。
3.?DROP
?的原理
類型:DDL(數據定義語言)
功能:徹底刪除表結構及數據,釋放所有關聯對象(索引、約束等)。
原理:
-
元數據刪除:從數據字典(
DBA_OBJECTS
、DBA_TABLES
?等)中刪除表的定義。 -
段釋放:釋放表及其索引、LOB 列等占用的所有存儲空間。
-
非事務性:隱式提交,不可回滾。
DROP TABLE employees PURGE; ?-- 徹底刪除表(跳過回收站)
適用場景:
-
永久刪除不再需要的表。
-
清理測試環境中的臨時表。
注意事項:
-
回收站機制:默認情況下,表會被移動到回收站(
RECYCLEBIN
),可通過?FLASHBACK TABLE
?恢復。 -
依賴對象:刪除表時會級聯刪除索引、觸發器等依賴對象。
三者的核心對比
特性 | DELETE | TRUNCATE | DROP |
---|---|---|---|
操作類型 | DML | DDL | DDL |
事務支持 | 支持回滾 | 隱式提交,不可回滾 | 隱式提交,不可回滾 |
日志生成 | 生成大量 undo/redo 日志 | 僅記錄元數據日志 | 僅記錄元數據日志 |
性能 | 慢(逐行操作) | 快(段級操作) | 快(元數據刪除) |
存儲空間釋放 | 不釋放(HWM 不變) | 釋放(HWM 重置) | 完全釋放 |
觸發器觸發 | 觸發 | 不觸發 | 不觸發 |
恢復方式 | 事務回滾 | 需備份恢復 | 回收站或備份恢復 |
語法示例 | DELETE FROM table WHERE | TRUNCATE TABLE table | DROP TABLE table |
4.如何選擇?
-
刪除部分數據且需回滾?→?
DELETE
-
快速清空大表所有數據?→?
TRUNCATE
-
徹底刪除表及結構?→?
DROP
注意事項
-
TRUNCATE
?與分區表:-
可針對單個分區操作:
ALTER TABLE sales TRUNCATE PARTITION p2020;
-
-
DROP
?的回收站機制:-
恢復表:
FLASHBACK TABLE employees TO BEFORE DROP; -- 從回收站恢復
-
-
DELETE
?的性能優化:-
分批刪除減少 undo 壓力:
BEGINLOOPDELETE FROM employees WHERE department_id = 10 AND ROWNUM <= 10000;EXIT WHEN SQL%ROWCOUNT = 0;COMMIT;END LOOP; END;
-