高效快速删除Oracle表中重复记录_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2010 | 回复: 0   主题: 高效快速删除Oracle表中重复记录        下一篇 
yanghui
注册用户
等级:上尉
经验:584
发帖:92
精华:0
注册:2011-12-13
状态:离线
发送短消息息给yanghui 加好友    发送短消息息给yanghui 发消息
发表于: IP:您无权察看 2015-7-27 17:34:58 | [全部帖] [楼主帖] 楼主

如何高效删除表中重复记录,仅保留一条?



网上比较多的方法是如下的sql:

delete from 表 a

where (a.Id, a.seq) in
(select Id, seq from 表 group by Id, seq having count(*) > 1)
and rowid not in


(select min(rowid) from 表 group by Id, seq having count(*) > 1);



没有在(id,seq)上建立联合 index的时候,将会对表进行三次全表扫描,如果表很大的话,并不能高效删除重复记录.



如果改造为下面的SQL



delete 表

where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid


from 表

group by Id, seq
having count(*) > 1)
select rowid


from 表 a

where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)


将对表只有两次全表扫描.



如果重复的记录比较少,我们可以增加如下的hint:



delete 表

where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid


from 表

group by Id, seq
having count(*) > 1)
select /*+ leading(b) use_nl(b a) */rowid


from 表 a

where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)


并在(id,seq)上建立联合index,速度将会更快.



--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论