pengpenglin
成熟 稳重 自信 进取 责任心
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 100, comments - 54, 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
阅读(229)
评论(0)
编辑
收藏
所属分类:
Oracle 开发
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-06-29 16:30 编辑过
相关文章:
【原】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开发专题之:行列转换
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
<
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
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
J2EE 框架(3)
J2EE基础(2)
J2SE(10)
Java 工具(4)
Oracle SQL/PLSQL(9)
Oracle 体系结构(1)
Oracle 开发(13)
Oracle 管理(2)
Oracle 调优
Oracle 错误诊断
UML(2)
Unix / Linux(7)
Web基础(15)
其它技术(3)
模式与重构(19)
灌水(3)
电影与音乐(3)
走过的路
软件过程与软件方法(1)
随笔档案
2008年12月 (1)
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)
相册
08新春
国庆深圳华侨城之旅
年会
陈家祠之游
BlogJava热点博客
BeanSoft
Jack.Wang
如坐春风
诗特林
郑晖
银河使者
阿密果
隔叶黄莺
好友博客
无羽苍鹰
搜索
最新评论
1. re: Unix基本概念及入门技术【四】:Solaris下cp命令的若干注意点
不会用 ls -l 啊
--不会用 ls -l 啊
2. re: 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案
谢谢指点拉 害死人 了。。。。
--julio
3. re: 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案
多谢高人指点,解决了偶的问题,哈哈!!!!博主牛人
--胡
4. re: 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案[未登录]
我的是七彩虹C61板栽声卡,不知道到哪里下声卡驱动呀!
--kim
5. re: 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案
妈的,360不可靠啊,把我的也删了
--可怜人
阅读排行榜
1. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(2838)
2. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)(2091)
3. 【原创】Oracle管理专题之:Oracle9i 字符集与NLS_LANG搭配测试兼乱码问题分析(1880)
4. 【原】Oracle开发专题之:行列转换(1821)
5. getOutputStream() has already been called for this response的解决方法(1555)
评论排行榜
1. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(18)
2. 基于Service和Command模式的简单MVC实现(4)
3. 【原】Oracle开发专题之:级联查询(Hierarchical Queries)(3)
4. 【原】Oracle开发专题之:分析函数(OVER)(3)
5. 【原】《American History X》影评(3)
60天内阅读排行
1. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(2838)
2. 【原】《American History X》影评(56)
3. 【Linux学习笔记】文件类型与扩展名(44)
4. 【Linux学习笔记】文件权限学习要点(42)
5. 【转】80后作文必杀句,你用过几句?(38)