Oracle 大数据量去重实验

来源:互联网 发布:网络语香菇是什么意思 编辑:程序博客网 时间:2024/05/22 13:14
[sql] view plain copy
  1. -- 环境:64位11.2G  
  2.   
  3. -- 一、建立测试表,生成2000万测试数据,其中200万重复  
  4.   
  5. CREATE TABLE test_t  
  6. (  
  7.    id     NUMBER (8) NOT NULL PRIMARY KEY,  
  8.    name   VARCHAR2 (32)  
  9. );  
  10.   
  11. BEGIN  
  12.    FOR i IN 1 .. 18000000  
  13.    LOOP  
  14.       INSERT INTO test_t (id, name)  
  15.            VALUES (i, SYS_GUID ());  
  16.    END LOOP;  
  17.   
  18.    COMMIT;  
  19. END;  
  20. /  
  21.   
  22. INSERT INTO test_t (id, name)  
  23.    SELECT 18000000 + (id / 9), name  
  24.      FROM test_t  
  25.     WHERE MOD (id, 9) = 0;  
  26.   
  27. COMMIT;  
  28.   
  29. CREATE INDEX idx_test_anme  
  30.    ON test_t (name);  
  31.   
  32. ANALYZE TABLE test_t COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;  
  33.   
  34.   
  35. -- 二、两种去重方案对比执行时间  
  36. -- 方案1:建立中间表,生成辅助对象,删除原表,改表名  
  37.   
  38. CREATE TABLE temp  
  39. AS  
  40.    SELECT *  
  41.      FROM test_t a  
  42.     WHERE a.ROWID = (SELECT MIN (b.ROWID)  
  43.                        FROM test_t b  
  44.                       WHERE a.name = b.name);  
  45.   
  46. -- 用时:08:14.79  
  47.   
  48. CREATE INDEX idx  
  49.    ON temp (name);  
  50.   
  51. -- 用时:02:45.73  
  52.   
  53. ALTER TABLE temp ADD CONSTRAINT temp_pk PRIMARY KEY (id);  
  54.   
  55. -- 用时:01:15.79  
  56.   
  57. -- 总用时:12分16秒  
  58.   
  59.   
  60. -- 方案2:直接删除原表中的重复数据  
  61.   
  62. DELETE test_t a  
  63.  WHERE a.ROWID > (SELECT MIN (b.ROWID)  
  64.                     FROM test_t b  
  65.                    WHERE a.name = b.name);  
  66.   
  67. -- 用时:2个小时没出来,中断退出。  
0 0