兩種刪除方式本質差異
| 特性 | DELETE | TRUNCATE |
| 類型 | DML | DDL |
| 觸發器 | 觸發 | 不觸發 |
| UNDO/REDO | 產生大量 | 極少(僅字典變更) |
| 高水位線 | 不重置 | 重置 |
| 速度 | 慢(逐行) | 極快(元數據操作) |
| 回滾 | 可回滾 | 不可回滾 |
| 閃回恢復 | 支援 | 不支援 |
| WHERE 條件 | 支援 | 不支援 |
實驗驗證:TRUNCATE 後閃回失敗
- 建立還原點:
CREATE RESTORE POINT before_truncate;
- 執行
TRUNCATE TABLE test_table;
- 嘗試閃回:
FLASHBACK TABLE test_table TO RESTORE POINT before_truncate;
- 結果報錯:
ORA-38305: 无法闪回 TRUNCATE TABLE 操作

最佳實踐策略
- 全表清空且確定不需恢復:使用
TRUNCATE,秒級完成
- 需保留恢復能力:使用
DELETE,配合提交前驗證
- 分區表大量刪除:使用
DROP PARTITION 或 TRUNCATE PARTITION
- 生產環境謹慎操作:TRUNCATE 前務必備份或匯出關鍵數據
- 大表分批 DELETE:避免 UNDO 表空間爆滿,每批 5000-10000 行並提交
補充:DELETE 大表優化技巧
-- 使用 ROWID 分批刪除,避免全表掃描鎖定
DELETE FROM big_table
WHERE rowid IN (SELECT rowid FROM big_table WHERE condition AND ROWNUM <= 10000);