首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 大量表數據遷移與刪除實戰教程:INSERT 與 TRUNCATE 高效方案

     編輯:Oracle 資料庫基礎

在實際生產環境中,面對數百萬筆歷史數據的清理與歸檔需求,如何高效完成遷移並釋放源表空間是 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 萬筆)

操作步驟詳解

1. 建立歷史表並寫入遷移數據

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 生成,加速大量數據載入。

2. 建立臨時表暫存保留數據

CREATE TABLE ERP_T3 NOLOGGING AS
SELECT * FROM ERP_T1
WHERE DORDERDATE >= TO_DATE('2013-01-01', 'YYYY-MM-DD');

3. 確認無誤後清空源表

TRUNCATE TABLE ERP_T1;

關鍵抉擇:為何用 TRUNCATE 而非 DELETE?

  • DELETE 逐行刪除、產生大量 Undo/Redo、可回滾、觸發 Trigger、耗時極長。
  • TRUNCATE 直接釋放 High Water Mark、幾乎不產生 Redo、不可回滾、秒級完成。
  • 注意:TRUNCATE 為 DDL 隱式提交,執行前務必確認備份與業務窗口。

4. 將保留數據寫回源表

ALTER TABLE ERP_T1 NOLOGGING;
INSERT /*+ APPEND */ INTO ERP_T1 SELECT * FROM ERP_T3;

APPEND Hint 開啟直接路徑載入,配合 NOLOGGING 表屬性,極大提升寫入吞吐。重要:在 ARCHIVELOG 模式下執行 NOLOGGING 操作後,必須盡快對受影響數據文件執行 Level 0 基準備份,防止介質故障導致數據不可恢復。

5. 清理臨時表

DROP TABLE ERP_T3;

總結與最佳實踐

  • 大表遷移首選 CTAS + TRUNCATE + APPEND 組合,避免逐行 DML 開銷。
  • 操作前驗證數據筆數、抽樣比對關鍵字段,確保業務邏輯一致性。
  • NOLOGGING 操作後務必補全備份策略,平衡性能與可恢復性。
  • 若表存在外鍵、觸發器或物化視圖,需額外評估依賴影響。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved