核心差異對照表
| 特性 | DELETE | TRUNCATE |
| 指令類型 | DML | DDL |
| 可回滾 | 是(產生 UNDO) | 否(隱性提交) |
| 觸發器 | 觸發 DELETE TRIGGER | 不觸發任何觸發器 |
| 高水位線 (HWM) | 不重置 | 重置至初始位置 |
| 執行速度 | 慢(逐列刪除、記錄 UNDO) | 極快(僅更新資料字典) |
| WHERE 子句 | 支援 | 不支援(全表清空) |
| 權限需求 | DELETE 權限 | DROP TABLE 權限 |
| 外鍵約束 | 檢查並可 CASCADE | 若有啟用 FK 參考則失敗 |
| 空間釋放 | 不自動釋放(保留 extent) | 預設 DROP STORAGE 釋放空間 |
實測情境
SQL> DESC t;
Name Null? Type
----- ----- -------------
A VARCHAR2(200)
SQL> TRUNCATE TABLE t; -- 清理舊資料
SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM t; -- 0 rows
選擇指南
- 全表清空、重置測試資料、大量載入前準備 →
TRUNCATE
- 條件式刪除、需觸發稽核觸發器、需保留 HWM、外鍵關聯表 →
DELETE
- 大表刪除大部分資料:考慮
CREATE TABLE AS SELECT 保留需求資料 → DROP 舊表 → RENAME 新表
進階選項
TRUNCATE TABLE t REUSE STORAGE; -- 保留 extent,不重置 HWM
TRUNCATE TABLE t DROP STORAGE; -- 預設,釋放空間重置 HWM
注意事項
- TRUNCATE 為 DDL,執行前後會隱性提交,無法在交易中回滾
- 無法 TRUNCATE 父表(被 FK 參考),必須先 DISABLE CONSTRAINT
- 12c+ 可搭配
CASCADE 選項自動處理參考分區表