表 DEMO 由 DBA_OBJECTS 重複複製,約 88 萬筆,非重複 27,323 筆,無索引。
DELETE FROM DEMO A
WHERE A.ROWID <> (SELECT MAX(ROWID) FROM DEMO B
WHERE B.OBJECT_ID = A.OBJECT_ID);
-- 耗時:數小時以上
DELETE FROM DEMO
WHERE ROWID IN (
SELECT RID FROM (
SELECT ROWID RID, ROW_NUMBER() OVER (PARTITION BY OBJECT_ID ORDER BY ROWID) RN
FROM DEMO
) WHERE RN <> 1
);
-- 耗時:約 30 秒
CREATE TABLE DEMO2 AS
SELECT OBJECT_ID, OWNER, ...
FROM (
SELECT DEMO.*, ROW_NUMBER() OVER (PARTITION BY OBJECT_ID ORDER BY ROWID) RN
FROM DEMO
) WHERE RN = 1;
TRUNCATE TABLE DEMO;
INSERT INTO DEMO SELECT * FROM DEMO2;
DROP TABLE DEMO2;
-- 總耗時:約 10 秒,適合大資料量,產生極少回滾