在實際生產環境中,面對數百萬筆歷史數據的清理與歸檔需求,如何高效完成遷移並釋放源表空間是 DBA 常見課題。本文記錄一個真實案例:某應用系統單表擁有約 700 萬筆數據,需將 2013 年前的 500 萬筆歷史數據遷移至歸檔表,並從源表刪除。採用 CREATE TABLE ... AS SELECT(CTAS)結合 TRUNCATE 與 INSERT /*+ APPEND */ 的組合策略,實現零停機、高性能的數據搬遷。
客戶環境:用戶 ADMINERP,源表 ERP_T1,目標歷史表 ERP_T2,臨時過渡表 ERP_T3。依據 DORDERDATE 字段劃分:
DORDERDATE IS NULL OR DORDERDATE < '2013-01-01'(約 500 萬筆)DORDERDATE >= '2013-01-01'(約 200 萬筆)CREATE TABLE ERP_T2 NOLOGGING AS
SELECT * FROM ERP_T1
WHERE DORDERDATE IS NULL OR DORDERDATE < TO_DATE('2013-01-01', 'YYYY-MM-DD');
使用 NOLOGGING 減少 Redo 生成,加速大量數據載入。
CREATE TABLE ERP_T3 NOLOGGING AS
SELECT * FROM ERP_T1
WHERE DORDERDATE >= TO_DATE('2013-01-01', 'YYYY-MM-DD');
TRUNCATE TABLE ERP_T1;
關鍵抉擇:為何用 TRUNCATE 而非 DELETE?
DELETE 逐行刪除、產生大量 Undo/Redo、可回滾、觸發 Trigger、耗時極長。TRUNCATE 直接釋放 High Water Mark、幾乎不產生 Redo、不可回滾、秒級完成。TRUNCATE 為 DDL 隱式提交,執行前務必確認備份與業務窗口。ALTER TABLE ERP_T1 NOLOGGING;
INSERT /*+ APPEND */ INTO ERP_T1 SELECT * FROM ERP_T3;
APPEND Hint 開啟直接路徑載入,配合 NOLOGGING 表屬性,極大提升寫入吞吐。重要:在 ARCHIVELOG 模式下執行 NOLOGGING 操作後,必須盡快對受影響數據文件執行 Level 0 基準備份,防止介質故障導致數據不可恢復。
DROP TABLE ERP_T3;