[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個小時沒出來,中斷退出。
oralce 大數據去重
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.