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

Oracle 重複資料刪除三大場景實戰:部分欄位重複、整列重複、誤區澄清

     編輯:Oracle 資料庫基礎

資料表出現重複資料時,刪除策略取決於「重複定義」:僅關鍵欄位重複?還是整列完全相同?本文提供三種場景的標準寫法、效能優化技巧,並澄清一個常見誤區。

場景一:關鍵欄位重複,保留最新一筆 (ROWID 法)

查詢重複集合

SELECT col1, col2, COUNT(*)
FROM tbl
GROUP BY col1, col2
HAVING COUNT(*) > 1;

低效寫法 (不建議大表使用)

DELETE FROM tbl a
WHERE (col1, col2) IN (
  SELECT col1, col2 FROM tbl
  GROUP BY col1, col2 HAVING COUNT(*) > 1
);

子查詢每次執行皆需全表掃描聚合,極慢。

標準高效寫法:臨時表 + ROWID

-- 1. 建立臨時表存放每組保留的 ROWID (最大值 = 最新)
CREATE TABLE tmp_keep AS
SELECT col1, col2, MAX(ROWID) AS keep_rid
FROM tbl
GROUP BY col1, col2;

-- 2. 刪除非保留列
DELETE FROM tbl a
WHERE a.ROWID != (
  SELECT b.keep_rid FROM tmp_keep b
  WHERE a.col1 = b.col1 AND a.col2 = b.col2
);
COMMIT;

-- 3. 清理
DROP TABLE tmp_keep;

單句腳本版 (利用相關子查詢,中小表可用)

DELETE FROM tbl a
WHERE a.ROWID != (
  SELECT MAX(b.ROWID)
  FROM tbl b
  WHERE a.col1 = b.col1 AND a.col2 = b.col2
);

場景二:整列完全重複,去重留一 (DISTINCT 法)

-- 1. 建立去重臨時表
CREATE TABLE tmp_dedup AS SELECT DISTINCT * FROM tbl;

-- 2. 清空原表 (TRUNCATE 產生極少 UNDO/REDO,比 DELETE 快)
TRUNCATE TABLE tbl;

-- 3. 資料寫回
INSERT INTO tbl SELECT * FROM tmp_dedup;

-- 4. 清理
DROP TABLE tmp_dedup;

注意:若表有主鍵/唯一索引,TRUNCATE 會重置 High Water Mark 並釋放空間,後續 INSERT 效能最佳。

場景三:澄清 — 「如何快速刪除 Oracle 資料庫」非刪除重複資料

網路上流傳一篇標題為「怎樣快速刪除 Oracle 資料庫」的文章,內容卻是:

  1. 開啟 regedit 刪除 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle 節點
  2. 刪除資料檔目錄
  3. 刪除 Program Files\Oracle 目錄

這是「卸載/移除 Oracle 軟體」,而非「刪除表內重複資料」! 請勿混淆。正規卸載請使用 Oracle Universal Installer (OUI) 或 deinstall 工具,手動刪除登錄與檔案會留下殘留物導致後續安裝失敗。

效能優化關鍵點總結

場景核心技巧避坑指南
部分欄位重複臨時表存 MAX(ROWID) + 索引加速 JOIN勿直接用 IN 子查詢刪除大表
整列重複CREATE TABLE AS SELECT DISTINCT + TRUNCATE + INSERT若有 FK 參考,需先 DISABLE CONSTRAINT
大量刪除通用分批刪除 (每批 5000-10000 列) + COMMIT,避免 UNDO 爆滿/鎖升級監控 V$TRANSACTION.USED_UBLK

補充:ROWID 特性

  • 每列唯一、物理定位碼,包含資料檔號、區塊號、列號
  • 相同表中,ROWID 較大通常代表較晚插入 (非絕對,視 ASSM/手動段空間管理而定)
  • 可用 DBMS_ROWID.ROWID_CREATE 解析細節
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved