方案一:標準 DELETE 陳述式
DELETE FROM <table_name>;
| 優點 | 缺點 |
| 標準 SQL,語意清晰;觸發 Trigger、檢查約束、RI 完整性 |
逐行寫入日誌,大表極慢;需大量日誌空間(LOGFILSIZ/LOGPRIMARY);高水位線不下降 |
適用:小表、需觸發器/RI 檢查、需可恢復(Point-in-time Recovery)。
方案二:ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
ALTER TABLE <table_name> ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
| 優點 | 缺點 |
| 不產生日誌,速度最快;瞬間完成 |
僅限建表時指定 NOT LOGGED INITIALLY 的表;操作不可恢復(崩潰後表損壞,需 DROP 重建);易誤用導致資料遺失 |
適用:臨時表、可重建的階段性資料、極大表且接受不可恢復風險。
方案三:IMPORT / LOAD FROM /dev/null REPLACE
-- Unix/Linux
IMPORT FROM /dev/null OF DEL REPLACE INTO <table_name>;
LOAD FROM /dev/null OF DEL REPLACE INTO <table_name> NONRECOVERABLE;
-- Windows (使用空檔案)
IMPORT FROM NUL OF DEL REPLACE INTO <table_name>;
LOAD FROM NUL OF DEL REPLACE INTO <table_name> NONRECOVERABLE;
| 優點 | 缺點 |
不需表預先定義 NOT LOGGED;LOAD 速度極快(直接寫頁);可配合 NONRECOVERABLE 避免備份掛起 |
IMPORT 仍走日誌較慢;LOAD 需獨佔表鎖;REPLACE 會觸發 Trigger/RI(LOAD 不觸發);需考慮備份策略 |
關鍵差異:IMPORT 本質是批次 INSERT,走 SQL 引擎;LOAD 直接格式化資料頁寫入磁碟,繞過 SQL 層,效能高數量級。
方案四:DROP TABLE + CREATE TABLE
DROP TABLE <table_name>;
CREATE TABLE <table_name> (...); -- 使用 db2look 獲取原始 DDL
| 優點 | 缺點 |
| 瞬間釋放空間(高水位線歸零);索引、統計資訊同步重建;大表最快 |
需重建權限、Trigger、View、MQT 等相依物件;外鍵需先 DROP 再建;DDL 鎖定目錄表 |
綜合選擇決策樹
- 表 < 100 萬列 / 需完整日誌 / 有 Trigger/RI →
DELETE(分批提交避免日誌爆滿)。
- 表極大 / 可接受不可恢復 / 建表時有 NOT LOGGED INITIALLY →
ALTER ... WITH EMPTY TABLE。
- 表大 / 需高效 / 可接受短暫鎖表 / 有備份策略 →
LOAD FROM /dev/null REPLACE NONRECOVERABLE。
- 需徹底重置(含高水位線、統計、碎片) / 相依物件少 / 有 DDL 腳本 →
DROP + CREATE(配合 db2look -e -t tab 獲取 DDL)。
操作前必檢清單
- 確認備份窗口與恢復策略(特別是 NONRECOVERABLE / NOT LOGGED 操作後)。
- 大表
DELETE 時:db2 "CALL SYSPROC.ADMIN_CMD('RUNSTATS ON TABLE ...')" 更新統計;考慮 REORG 回收空間。
- 生產環境變更前必在測試環境驗證腳本與耗時。