oralce 大數據去重

[sql] view plain copy
-- 環境:64位11.2G  

-- 一、建立測試表,生成2000萬測試數據,其中200萬重復  

CREATE TABLE test_t  
(  
   id     NUMBER (8) NOT NULL PRIMARY KEY,  
   name   VARCHAR2 (32)  
);  

BEGIN  
   FOR i IN 1 .. 18000000  
   LOOP  
      INSERT INTO test_t (id, name)  
           VALUES (i, SYS_GUID ());  
   END LOOP;  

   COMMIT;  
END;  
/  

INSERT INTO test_t (id, name)  
   SELECT 18000000 + (id / 9), name  
     FROM test_t  
    WHERE MOD (id, 9) = 0;  

COMMIT;  

CREATE INDEX idx_test_anme  
   ON test_t (name);  

ANALYZE TABLE test_t COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;  


-- 二、兩種去重方案對比執行時間  
-- 方案1:建立中間表,生成輔助對象,刪除原表,改表名  

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);  

-- 用時:08:14.79  

CREATE INDEX idx  
   ON temp (name);  

-- 用時:02:45.73  

ALTER TABLE temp ADD CONSTRAINT temp_pk PRIMARY KEY (id);  

-- 用時:01:15.79  

-- 總用時:12分16秒  


-- 方案2:直接刪除原表中的重複數據  

DELETE test_t a  
 WHERE a.ROWID > (SELECT MIN (b.ROWID)  
                    FROM test_t b  
                   WHERE a.name = b.name);  

-- 用時:2個小時沒出來,中斷退出。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章