分享

oracle 删除重复项数据 oracle 删除重复项数据

 昵称10504424 2013-05-05
网上有很多的删除重复数据的 SQL 的例子. 有使用 GROUP BY HAVING 等, 还有一个 DISTINCT 关键字。我实验了下觉得这些的删除大数据的效率不怎么高!!

     我觉得有两种方法删除数据的效率是蛮大的,rowid 和分析函数。

     我现在用个例子来证明下:只匹配 NAME 完全相等的记录

      先来创建个表    

CREATE TABLE TEMPTEMP (
ID NUMBER,
NAME VARCHAR2(20)
);
-- 生成重复数据
-- 0.297秒
DECLARE
BEGIN
FOR I IN 1..10000 LOOP
INSERT INTO TEMPTEMP VALUES (I, 'AAA' || I);
END LOOP;
END;
/
-- 0.015
DECLARE
BEGIN
FOR I IN 1..1000 LOOP
INSERT INTO TEMPTEMP VALUES (I, 'AAA' || I);
END LOOP;
END;
/
-- 0.031
DECLARE
TE INT;
BEGIN
FOR I IN 10001..11000 LOOP
TE := 1;
INSERT INTO TEMPTEMP VALUES (I, 'AAA' || TE);
TE := TE + 1;
END LOOP;
END;
/
SQL> select count(*) from temptemp;

COUNT(*)
--------------
12000

创建索引

 

-- 0.015秒 建索引
CREATE INDEX INDEX_TEMP ON TEMPTEMP(ID, NAME);

 

     1.根据rowid删除数据     

-- 0.047秒 2000 rows deleted
DELETE FROM TEMPTEMP T1 WHERE T1.ROWID !=
(SELECT MAX(T2.ROWID) FROM TEMPTEMP T2  -----这里还可以用最小值去重复
WHERE /*T1.ID = T2.ID AND*/ T1.NAME = T2.NAME);
-- 去掉 注释后 0.047秒 1000 rows deleted

2.使用分析函数

-- 0.031秒 2000 rows deleted
DELETE FROM TEMPTEMP T1 WHERE T1.ROWID IN
(SELECT RID FROM (SELECT ROWID RID,
ROW_NUMBER() OVER (PARTITION BY /*ID,*/ NAME ORDER BY ROWID) RN
FROM TEMPTEMP) WHERE RN != 1);
-- 去掉 ID 匹配后 0.031秒 1000 rows deleted

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多