oracle快速删除重复记录

oracle快速删除重复记录

ID:6321794

大小:52.00 KB

页数:12页

时间:2018-01-10

oracle快速删除重复记录_第1页
oracle快速删除重复记录_第2页
oracle快速删除重复记录_第3页
oracle快速删除重复记录_第4页
oracle快速删除重复记录_第5页
资源描述:

《oracle快速删除重复记录》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、oracle-快速删除重复的记录http://tech.163.com 2006-06-2109:29:12 来源:csdn  网友评论0 条论坛 文/Ray做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统。也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉。对此,总结了一下删除重复记录的方法,以及每种方法的优缺点。为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,co

2、l2上加了索引。1、通过创建临时表可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:creattabletbl_tmp(selectdistinct*fromtbl);truncatetabletbl;//清空表记录insertintotblselect*fromtbl_tmp;//将临时表中的数据插回来。这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。2、利用rowid在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是

3、唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:deletefromtblwhererowidin(selecta.rowidfromtbla,tblbwherea.rowid>b.rowidanda.col1=b.col1anda.col2=b.col2)如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。3、利用max或min函数这里也要使用rowid,与上面不

4、同的是结合max或min函数来实现。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、方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用groupby,提高效率嵌套表外部表和内部表指定引起的逻辑读开销1、使用leading和use_nl来设置表的查询顺序,来加快查询速度,一般把小表设为第一个表。/*+LEADING(TABLE)*/  将指定的表作为连接次序中的首表./*+USE_NL(TABLE)*/  将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.成本计算方法:设小表100行,大表100000行。两表均有索引:

7、如果小表在内,大表在外(驱动表)的话,则扫描次数为:100000+100000*2(其中2表示IO次数,一次索引,一次数据)如果大表在内,小表在外(驱动表)的话,则扫描次数为:100+100*2.两表均无索引:如果小表在内,大表在外的话,则扫描次数为:100000+100*100000如果大表在内,小表在外的话,则扫描次数为:100+100000*100注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。#################使用HAS

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。