| 維度 | TRUNCATE | DELETE (無 WHERE) | DROP |
|---|---|---|---|
| 語句類型 | DDL | DML | DDL |
| 刪除範圍 | 全表數據 | 全表數據 | 表結構+數據+依賴對象 |
| 可回滾 | 否(隱式提交) | 是(需 COMMIT/ROLLBACK) | 否 |
| 觸發器 | 不觸發 | 觸發 FOR EACH ROW/STATEMENT | 不觸發 |
| 高水位線 (HWM) | 重置到初始位置 | 不變 | 釋放空間,對象消失 |
| 空間釋放 | 默認釋放到 MINEXTENTS,REUSE STORAGE 保留 | 不釋放 | 完全釋放 |
| 速度 | 極快(元數據操作) | 慢(逐行生成 REDO/UNDO) | 最快(僅字典操作) |
| 外鍵約束 | 被引用時不可執行 | 受約束檢查 | 級聯刪除約束 |
| 權限要求 | DROP ANY TABLE 或表擁有者 | DELETE 權限 | DROP ANY TABLE 或表擁有者 |
全表掃描讀取到 HWM 以下塊。大量刪除後 HWM 不下降,導致後續全掃性能差。`TRUNCATE` 或 `ALTER TABLE ... MOVE` + `SHRINK SPACE` 可重置 HWM。
-- 分批提交,避免 UNDO 爆滿、鎖升級
LOOP
DELETE FROM big_table WHERE create_dt < :cutoff AND ROWNUM <= 10000;
EXIT WHEN SQL%ROWCOUNT = 0;
COMMIT;
END LOOP;
-- 未 PURGE 時可恢復
FLASHBACK TABLE dropped_table TO BEFORE DROP;
-- 查看回收站
SELECT * FROM RECYCLEBIN;
⚠️ **生產環境嚴禁無備份直接 DROP/TRUNCATE**。建議:
理解三者在存儲、事務、觸發器、HWM 等維度的本質差異,是數據庫開發與運維的必修課。