oracle快速刪除重復(fù)記錄

oracle快速刪除重復(fù)記錄

ID:6321794

大小:52.00 KB

頁數(shù):12頁

時間:2018-01-10

oracle快速刪除重復(fù)記錄_第1頁
oracle快速刪除重復(fù)記錄_第2頁
oracle快速刪除重復(fù)記錄_第3頁
oracle快速刪除重復(fù)記錄_第4頁
oracle快速刪除重復(fù)記錄_第5頁
資源描述:

《oracle快速刪除重復(fù)記錄》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、oracle-快速刪除重復(fù)的記錄http://tech.163.com 2006-06-2109:29:12 來源:csdn  網(wǎng)友評論0?條論壇 文/Ray做項目的時候,一位同事導(dǎo)數(shù)據(jù)的時候,不小心把一個表中的數(shù)據(jù)全都搞重了,也就是說,這個表里所有的記錄都有一條重復(fù)的。這個表的數(shù)據(jù)是千萬級的,而且是生產(chǎn)系統(tǒng)。也就是說,不能把所有的記錄都刪除,而且必須快速的把重復(fù)記錄刪掉。對此,總結(jié)了一下刪除重復(fù)記錄的方法,以及每種方法的優(yōu)缺點。為了陳訴方便,假設(shè)表名為Tbl,表中有三列col1,col2,col3,其中col1,col2是主鍵,并且,col1,co

2、l2上加了索引。1、通過創(chuàng)建臨時表可以把數(shù)據(jù)先導(dǎo)入到一個臨時表中,然后刪除原表的數(shù)據(jù),再把數(shù)據(jù)導(dǎo)回原表,SQL語句如下:creattabletbl_tmp(selectdistinct*fromtbl);truncatetabletbl;//清空表記錄insertintotblselect*fromtbl_tmp;//將臨時表中的數(shù)據(jù)插回來。這種方法可以實現(xiàn)需求,但是很明顯,對于一個千萬級記錄的表,這種方法很慢,在生產(chǎn)系統(tǒng)中,這會給系統(tǒng)帶來很大的開銷,不可行。2、利用rowid在oracle中,每一條記錄都有一個rowid,rowid在整個數(shù)據(jù)庫中是

3、唯一的,rowid確定了每條記錄是oracle中的哪一個數(shù)據(jù)文件、塊、行上。在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會相同。SQL語句如下:deletefromtblwhererowidin(selecta.rowidfromtbla,tblbwherea.rowid>b.rowidanda.col1=b.col1anda.col2=b.col2)如果已經(jīng)知道每條記錄只有一條重復(fù)的,這個sql語句適用。但是如果每條記錄的重復(fù)記錄有N條,這個N是未知的,就要考慮適用下面這種方法了。3、利用max或min函數(shù)這里也要使用rowid,與上面不

4、同的是結(jié)合max或min函數(shù)來實現(xiàn)。SQL語句如下deletefromtblawhererowidnotin(selectmax(b.rowid)fromtblbwherea.col1=b.col1anda.col2=b.col2);//這里max使用min也可以或者用下面的語句deletefromtblawhererowid<(selectmax(b.rowid)fromtblbwherea.col1=b.col1anda.col2=b.col2);//這里如果把max換成min的話,前面的where子句中需要把"<"改為">"跟上面的方法思路基本

5、是一樣的,不過使用了groupby,減少了顯性的比較條件,提高效率。SQL語句如下:deletefromtblwhererowidnotin(selectmax(rowid)fromtbltgroupbyt.col1,t.col2);deletefromtblwhere(col1,col2)in(selectcol1,col2fromtblgroupbycol1,col2havingcount(*)>1)androwidnotin(selectnin(rowid)fromtblgroupbycol1,col2havingcount(*)>1)還有一種

6、方法,對于表中有重復(fù)記錄的記錄比較少的,并且有索引的情況,比較適用。假定col1,col2上有索引,并且tbl表中有重復(fù)記錄的記錄比較少,SQL語句如下4、利用groupby,提高效率嵌套表外部表和內(nèi)部表指定引起的邏輯讀開銷1、使用leading和use_nl來設(shè)置表的查詢順序,來加快查詢速度,一般把小表設(shè)為第一個表。/*+LEADING(TABLE)*/  將指定的表作為連接次序中的首表./*+USE_NL(TABLE)*/  將指定表與嵌套的連接的行源進行連接,并把指定表作為內(nèi)部表.成本計算方法:設(shè)小表100行,大表100000行。兩表均有索引:

7、如果小表在內(nèi),大表在外(驅(qū)動表)的話,則掃描次數(shù)為:100000+100000*2(其中2表示IO次數(shù),一次索引,一次數(shù)據(jù))如果大表在內(nèi),小表在外(驅(qū)動表)的話,則掃描次數(shù)為:100+100*2.兩表均無索引:如果小表在內(nèi),大表在外的話,則掃描次數(shù)為:100000+100*100000如果大表在內(nèi),小表在外的話,則掃描次數(shù)為:100+100000*100注意:如果一個表有索引,一個表沒有索引,ORACLE會將沒有索引的表作驅(qū)動表。如果兩個表都有索引,則外表作驅(qū)動表。如果兩個都沒索引的話,則也是外表作驅(qū)動表。#################使用HAS

8、H連接#################SQL>select?/*+orderedno_merge(tb)U

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。