ITPub博客

首页 > 数据库 > Oracle > 去除重复记录

去除重复记录

原创 Oracle 作者:壹頁書 时间:2013-11-09 22:18:53 0 删除 编辑
试验表包括200万记录,其中20万记录是重复的。
比较新建表然后改名和原表删除两种去重方法。

首先初始化数据。
  1. CREATE TABLE test_t
  2. (
  3.    id NUMBER (8) NOT NULL PRIMARY KEY,
  4.    name VARCHAR2 (32)
  5. );
  6.   
  7. BEGIN
  8.    FOR i IN 1 .. 1800000
  9.    LOOP
  10.       INSERT INTO test_t (id, name)
  11.            VALUES (i, SYS_GUID ());
  12.    END LOOP;
  13.   
  14.    COMMIT;
  15. END;
  16. /

  17. INSERT INTO test_t (id, name)
  18.    SELECT 1800000 + (id / 9), name
  19.      FROM test_t
  20.     WHERE MOD (id, 9) = 0;
  21.   
  22. COMMIT;

  23. CREATE INDEX idx_test_anme
  24.    ON test_t (name);
  25.   
  26. ANALYZE TABLE test_t COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;
1.新建一个表,删除原表,然后将新建的表改名,大约用时90s.
CREATE TABLE temp  
AS  
        SELECT *  
        FROM test_t a  
        WHERE a.ROWID = (    
                                                SELECT MIN (b.ROWID)
                                                FROM test_t b  
                                                WHERE a.name = b.name
                                        );  
CREATE INDEX idx ON temp (name);    
ALTER TABLE temp ADD CONSTRAINT temp_pk PRIMARY KEY (id);  
drop table test_t purge;
alter table temp rename to test_t;
  1. SQL> set timing on
  2. SQL> CREATE TABLE temp
  3.   2 AS
  4.   3 SELECT *
  5.   4 FROM test_t a
  6.   5 WHERE a.ROWID = (SELECT MIN (b.ROWID)
  7.   6 FROM test_t b
  8.   7 WHERE a.name = b.name);

  9. 表已创建。

  10. 已用时间: 00: 00: 58.48
  11. SQL>
  12. SQL>
  13. SQL> CREATE INDEX idx
  14.   2 ON temp (name);

  15. 索引已创建。

  16. 已用时间: 00: 00: 24.11
  17. SQL>
  18. SQL> ALTER TABLE temp ADD CONSTRAINT temp_pk PRIMARY KEY (id);

  19. 表已更改。

  20. 已用时间: 00: 00: 04.88
  21. SQL>
  22. SQL> drop table test_t purge;

  23. 表已删除。

  24. 已用时间: 00: 00: 00.94
  25. SQL>
  26. SQL> alter table temp rename to test_t;

  27. 表已更改。

  28. 已用时间: 00: 00: 00.47
  29. SQL>
2.源表删除,大约用时2分钟。
DELETE test_t a
WHERE a.ROWID > (
                                        SELECT MIN (b.ROWID)
                                        FROM test_t b
                                        WHERE a.name = b.name
                                 );
  1. SQL> DELETE test_t a
  2.   2 WHERE a.ROWID > (SELECT MIN (b.ROWID)
  3.   3 FROM test_t b
  4.   4 WHERE a.name = b.name);

  5. 已删除200000行。

  6. 已用时间: 00: 02: 12.25
王工实验的原贴
http://blog.csdn.net/wzy0623/article/details/10199005




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-776216/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    621
  • 访问量
    5938429