pengpenglin
人,必須選擇一種生活方式并有勇氣堅持下去
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 262, comments - 221, trackbacks - 0
【原】Oracle開發專題之:刪除重復記錄
一、測試環境:
假設目前我們有一個表:test,該表的結構如下:
SQL
>
desc
test;
Name
Null
? Type
--
--------------------------------------- -------- ----------------------------
ID
NUMBER
SEQ
NUMBER
現在我們向表中插入200W條數據,這200W條數據中有一半是重復的。
create
or
replace
procedure
gen_duplicated_records
as
i
number
;
j
number
;
begin
for
i
in
1
..
2
loop
for
j
in
1
..
1000000
loop
insert
into
test
values
(j, j
+
10
);
end
loop;
commit
;
end
loop;
end
;
我們的最終目的就是剔除這一半的重復記錄。下面來看一下各種方法的使用及效率區別
二、使用臨時表進行刪除:
這個是最簡單的思路了,創建一張臨時表,將原表中的數據拷貝一半過去,再查詢出來。
SQL
>
set
timing
on
;
SQL
>
SQL
>
create
table
test_2
as
select
distinct
*
from
test;
Table
created.
Elapsed:
00
:
00
:
07.09
SQL
>
該方法耗時7.09秒,測試數據庫位于服務器上。考慮到服務器和本機位于同一個局域網內,該時間如果在真正的生產環境中應該至上延長1倍以上。
三、使用rowid進行刪除:
我們知道在Oracle中,rowid是用來唯一表示一條記錄的偽列,任意兩條記錄的rowid都是不同的,即便內容看起來一模一樣。所以我們的思路是:使用表的自連接,查找那些內容相同但rowid不同的記錄,即為重復記錄。然后隨意選擇其中一個rowid代表的記錄,刪除另一條記錄。
我們來看一下其中id=1的記錄在自連接后的情況:
SQL
>
select
a.
*
, a.rowid, b.
*
, b.rowid
from
test a, test b
where
a.id
=
b.id
and
a.seq
=
b.seq
and
a
.id
=
1
;
ID SEQ ROWID ID SEQ ROWID
--
-------- ---------- ------------------ ---------- ---------- ------------------
1
11
AAAGHIAAJAAAAAKAAA
1
11
AAAGHIAAJAAAAAKAAA
1
11
AAAGHIAAJAAAAgQAGX
1
11
AAAGHIAAJAAAAAKAAA
1
11
AAAGHIAAJAAAAAKAAA
1
11
AAAGHIAAJAAAAgQAGX
1
11
AAAGHIAAJAAAAgQAGX
1
11
AAAGHIAAJAAAAgQAGX
Elapsed:
00
:
00
:
02.08
SQL
>
我們看到自連接后的4條記錄中有2條的rowid是不同的,說明這2條記錄就是重復記錄,所以我們可以通過選擇其中rowid較大或較小的記錄,來刪除剩余的記錄。但是這種方法的一個很大的缺點就是由于采用了“
自連接
”,對于像我這樣的測試表中有200W條記錄的情況,其自連接后的記錄數是一個天文數字(其實本人的測試就因為等待過久而不得不取消)。
我們換另外一種方法:
DELETE
FROM
test t1
WHERE
t1.ROWID
NOT
IN
(
SELECT
MAX
(t2.rowid)
FROM
test t2
WHERE
t1.id
=
t2.id
AND
t1.seq
=
t2.seq);
實踐證明,這種方法對大量數據的情況,效率依然是很低的。結果如同上一種方法。假如我們再結合group by呢?
SQL
>
DELETE
FROM
test
2
WHERE
ROWID
NOT
IN
(
SELECT
MAX
(ROWID)
FROM
test
GROUP
BY
id, seq);
效果如同前面兩個方法一樣,大量的連接、排序、分組讓依靠rowid來刪除重復記錄變得很耗時,反而是采用方法1的情況下速度很快(本人測試了2次,都是連接測試服務器進行測試,第一次用時7.09秒,第二次用時14.656秒)。
小結:
在數據量不大的情況下,采用根據rowid或結合group by分組的方式是很快的,但是在海量數據的情況下則反而是方式一最快,因為省去了自連接、排序、分組的時間
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-06-18 11:04
Paul Lin
閱讀(1649)
評論(0)
編輯
收藏
所屬分類:
Oracle 開發
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
【原】Oracle開發專題之:時間運算2(日期截取及四舍五入)
【原】Oracle開發專題之:時間運算
【原】Oracle開發專題之:分析函數總結
【原】Oracle開發專題之:報表函數
【原】Oracle開發專題之:窗口函數
【原】Oracle應用專題之:分析函數3(Top/Bottom N、First/Last、NTile)
【原】Oracle開發專題之:分析函數2(Rank, Dense_rank, row_number)
【原】Oracle開發專題之:分析函數(OVER)
【原】Oracle開發專題之:刪除重復記錄
【原】Oracle開發專題之:行列轉換
Copyright ©2025 Paul Lin Powered by:
博客園
模板提供:
滬江博客
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(21)
給我留言
查看公開留言
查看私人留言
隨筆分類
J2EE 框架(9)
J2EE基礎(4)
J2SE(43)
Java 工具(5)
Oracle Concept(4)
Oracle SQL/PLSQL(9)
Oracle 開發(13)
Oracle 管理(4)
Oracle 調優
Oracle 錯誤診斷
RoR(19)
UML(3)
Unix / Linux(13)
Web基礎(19)
其它技術(7)
感悟(3)
雜項(7)
架構與性能(8)
模式與重構(19)
灌水(8)
電影與音樂(16)
走過的路(1)
軟件過程與軟件方法(3)
陽光戶外(2)
項目管理(36)
隨筆檔案
2012年2月 (3)
2011年11月 (4)
2011年10月 (1)
2011年9月 (2)
2011年8月 (2)
2011年7月 (5)
2011年6月 (3)
2011年5月 (1)
2011年4月 (1)
2011年3月 (3)
2011年1月 (1)
2010年12月 (1)
2010年11月 (5)
2010年10月 (3)
2010年9月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (4)
2010年4月 (9)
2010年3月 (19)
2010年2月 (8)
2010年1月 (3)
2009年12月 (34)
2009年11月 (1)
2009年10月 (2)
2009年7月 (4)
2009年6月 (5)
2009年5月 (3)
2009年4月 (2)
2009年3月 (1)
2009年2月 (5)
2009年1月 (5)
2008年12月 (13)
2008年11月 (4)
2008年10月 (1)
2008年9月 (6)
2008年8月 (5)
2008年7月 (3)
2008年6月 (31)
2008年5月 (10)
2008年4月 (9)
2008年3月 (7)
2008年2月 (4)
2008年1月 (19)
BlogJava熱點博客
BeanSoft
Jack.Wang
如坐春風
詩特林
鄭暉
銀河使者
阿密果
隔葉黃鶯
好友博客
無羽蒼鷹
搜索
最新評論
1.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
666666666666666666666這幾天正在做個類似工程編碼出現錯誤
--李
2.?re: 【Java基礎專題】IO與文件讀寫---使用Apache commons IO簡化文件讀寫
不錯
--阿斯蘭
3.?re: 【Java基礎專題】編碼與亂碼(03)----String的toCharArray()方法
多謝分享
--thx
4.?re: 【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換
評論內容較長,點擊標題查看
--karl
5.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
謝謝,幫了我大忙!
--小龍
閱讀排行榜
1.?Oracle中如何插入特殊字符:& 和 ' (多種解決方案)(48445)
2.?getOutputStream() has already been called for this response的解決方法(43350)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(37031)
4.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(21267)
5.?Java中讀取字節流并按指定編碼轉換成字符串的方法(17317)
評論排行榜
1.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(33)
2.?【原】Oracle開發專題之:時間運算(11)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(11)
4.?getOutputStream() has already been called for this response的解決方法(10)
5.?【原】Oracle開發專題之:分析函數(OVER)(8)
主站蜘蛛池模板:
国产午夜亚洲精品
|
中文字幕免费在线看线人动作大片
|
午夜无遮挡羞羞漫画免费
|
国产午夜亚洲精品不卡
|
亚洲成色在线综合网站
|
成年性羞羞视频免费观看无限
|
久久久久亚洲国产AV麻豆
|
久久青青成人亚洲精品
|
国产精品另类激情久久久免费
|
成人无码WWW免费视频
|
亚洲无吗在线视频
|
亚洲精品夜夜夜妓女网
|
性生交片免费无码看人
|
国内精品99亚洲免费高清
|
亚洲av永久综合在线观看尤物
|
亚洲精品高清一二区久久
|
四虎1515hh永久久免费
|
香蕉视频在线免费看
|
亚洲色大成网站www永久网站
|
国产成人毛片亚洲精品
|
性感美女视频在线观看免费精品
|
暖暖免费日本在线中文
|
MM1313亚洲国产精品
|
亚洲视频一区网站
|
亚洲色欲久久久久综合网
|
国产免费av片在线看
|
久久精品中文字幕免费
|
特级做a爰片毛片免费看
|
在线aⅴ亚洲中文字幕
|
亚洲第一中文字幕
|
国产亚洲美女精品久久久2020
|
日韩视频免费在线
|
国产妇乱子伦视频免费
|
国内精品免费久久影院
|
美女尿口扒开图片免费
|
久久国产高潮流白浆免费观看
|
一区免费在线观看
|
处破女第一次亚洲18分钟
|
亚洲w码欧洲s码免费
|
久久久亚洲裙底偷窥综合
|
亚洲人JIZZ日本人
|