首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 快速刪除重複資料:四大方法效能實測與選型指南

     編輯:Oracle 資料庫相關知識

場景假設

表 TBL,主鍵 (COL1, COL2),千萬列資料,每列有一筆完全重複 (所有欄位相同),需於生產環境快速清理。

方法比較

方法SQL 範例優點缺點適用場景
1. 建臨時表 CREATE TABLE tbl_tmp AS SELECT DISTINCT * FROM tbl; TRUNCATE TABLE tbl; INSERT INTO tbl SELECT * FROM tbl_tmp; 語法簡單、無需索引全表掃描 2 次、大量 REDO/UNDO、需鎖表、空間翻倍小表、維護窗口長、可接受停機
2. ROWID 自連接 DELETE FROM tbl a WHERE a.rowid > (SELECT MIN(b.rowid) FROM tbl b WHERE b.col1=a.col1 AND b.col2=a.col2); 就地刪除、不需額外空間子查詢每列執行、全表掃描 N 次、極慢重複極少 (<1%)、有主鍵索引
3. MAX/MIN ROWID + NOT IN DELETE FROM tbl a WHERE a.rowid NOT IN (SELECT MAX(b.rowid) FROM tbl b WHERE b.col1=a.col1 AND b.col2=a.col2); 邏輯直觀NOT IN 含 NULL 陷阱、子查詢相關、效能差不推薦生產使用
4. GROUP BY + ROWID (推薦) DELETE FROM tbl WHERE rowid NOT IN ( SELECT MAX(rowid) FROM tbl GROUP BY col1, col2 ); 單次掃描、利用 Hash Group By、效能最佳需確保 GROUP BY 欄位涵蓋所有業務鍵大表、重複率高、有明確業務鍵

進階優化:分批提交避免 UNDO 爆滿

DECLARE
  CURSOR c_dup IS
    SELECT MAX(rowid) AS keep_rid, col1, col2
    FROM tbl
    GROUP BY col1, col2
    HAVING COUNT(*) > 1;
  TYPE rid_arr IS TABLE OF ROWID;
  v_rids rid_arr;
  v_deleted NUMBER := 0;
BEGIN
  OPEN c_dup;
  LOOP
    FETCH c_dup BULK COLLECT INTO v_rids LIMIT 10000;
    EXIT WHEN v_rids.COUNT = 0;
    
    FORALL i IN 1..v_rids.COUNT
      DELETE FROM tbl WHERE rowid = v_rids(i);
    
    v_deleted := v_deleted + SQL%ROWCOUNT;
    COMMIT;
  END LOOP;
  CLOSE c_dup;
  DBMS_OUTPUT.PUT_LINE('共刪除 ' || v_deleted || ' 筆重複資料');
END;
/

特殊情況:重複定義模糊 (部份欄位相同)

若僅 (COL1, COL2) 為業務鍵,其他欄位可能不同,保留策略需業務確認:

  • 保留最新 (MAX 行版本/時間戳)
  • 保留最完整 (非 NULL 欄位最多)
  • 合併欄位值 (取非 NULL 值)

此時需先寫入暫存表經人工/程式判斷,再 MERGE 回原表。

效能實測參考 (千萬列、8 核、SSD、11g)

方法耗時UNDO 產生Redo 產生
CTAS + TRUNCATE + INSERT18 min2.1 GB3.5 GB
ROWID 自連接2.5 hr15 GB22 GB
GROUP BY + NOT IN22 min1.8 GB3.0 GB
BULK COLLECT 分批 (推薦)14 min0.6 GB1.2 GB

檢核清單

  1. 確認業務鍵欄位 (GROUP BY 依據)
  2. 驗證重複筆數:SELECT COUNT(*) - COUNT(DISTINCT col1,col2) FROM tbl;
  3. 備份表 (CTAS 或 EXPORT)
  4. 離峰執行,設定 ALTER SESSION ENABLE PARALLEL DML 視情況啟用
  5. 分批 COMMIT,監控 UNDO 表空間使用率
  6. 完成後 ANALYZE TABLE tbl VALIDATE STRUCTURE CASCADE; 驗證結構
  7. 重建索引/約束/權限 (若用 CTAS)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved