电竞比分网-中国电竞赛事及体育赛事平台

分享

oracle 刪除重復(fù)項(xiàng)數(shù)據(jù) oracle 刪除重復(fù)項(xiàng)數(shù)據(jù)

 昵稱10504424 2013-05-05
網(wǎng)上有很多的刪除重復(fù)數(shù)據(jù)的 SQL 的例子. 有使用 GROUP BY HAVING 等, 還有一個(gè) DISTINCT 關(guān)鍵字。我實(shí)驗(yàn)了下覺得這些的刪除大數(shù)據(jù)的效率不怎么高?。?/span>

     我覺得有兩種方法刪除數(shù)據(jù)的效率是蠻大的,rowid 和分析函數(shù)。

     我現(xiàn)在用個(gè)例子來證明下:只匹配 NAME 完全相等的記錄

      先來創(chuàng)建個(gè)表    

CREATE TABLE TEMPTEMP (
ID NUMBER,
NAME VARCHAR2(20)
);
-- 生成重復(fù)數(shù)據(jù)
-- 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

創(chuàng)建索引

 

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

 

     1.根據(jù)rowid刪除數(shù)據(jù)     

-- 0.047秒 2000 rows deleted
DELETE FROM TEMPTEMP T1 WHERE T1.ROWID !=
(SELECT MAX(T2.ROWID) FROM TEMPTEMP T2  -----這里還可以用最小值去重復(fù)
WHERE /*T1.ID = T2.ID AND*/ T1.NAME = T2.NAME);
-- 去掉 注釋后 0.047秒 1000 rows deleted

2.使用分析函數(shù)

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多