Oracle快速删除重复记录

你正在学习的Oracle课程是:Oracle快速删除重复记录。当做一个项目时,当一个同事引导数据时,他意外地将所有数据从表中取出。也就是说,表中的所有记录都是重复的,这个表的数据是一千万,是一个生产系统,也就是说,你不能删除所有的记录,你必须快速删除重复的记录。

在这方面,总结了重复记录的删除方法和每种方法的优缺点。

为了便于报告,这表叫Tbl,在表三列col1,col2,COL1,COL2和col3,COL1,COL2是主键,添加到索引。

1。通过创建一个临时表

可以先将数据导入临时表,然后删除原始表的数据,然后将数据返回到原始表,SQL语句如下所示:

创建表tbl_tmp(选择重复的任务表);任务型教学; / /插入任务选择空表记录* tbl_tmp; / /临时表中的数据插入后。
这种方法可以达到要求,但显然,对于110百万级的表,这种方法是非常缓慢的。在生产系统中,给系统带来很大的费用,是不可行的。

2。使用ROWID

在Oracle中,每个记录有一个rowid和rowid是独一无二的数据库。rowid确定哪些数据文件、块和行是每个Oracle。在重复记录,所有列的内容可能是相同的,但rowid会不一样。SQL语句如下:

删除从TBL在rowid在(选择a.rowid从TBL,TBL)
如果您已经知道每条记录只有一个副本,则应用此SQL语句。但是如果每个记录的重复记录有n且n未知,则应考虑以下方法。

三.使用马克斯函数或min函数

rowid也用在这里,这是不同于MAX或MIN函数,SQL语句如下

从任务型教学在rowid不删除(选择最大(b.rowid)从TBL在哪里a.col1 = b.col1和a.col2 = b.col2); / /最大最小也可以用在这里。
或使用以下语句

从任务型教学在rowid 删除
它与上面的思维方式基本相同,但使用组可以减少显性比较条件,提高效率:

deletefrom TBL在rowid不在(选择最大(rowid)从TBL T的t.col1 t.col2,删除);(col1,col2)任务,在(SELECT col1,col2从tblgroup bycol1 col2havingcount(*)> 1(selectnin)rowidnotin(rowid)fromtblgroup bycol1 col2havingcount(*)> 1)
还有一个更适合用更少的记录重复记录的表和索引方法。假定col1,col2有一个索引,并有较少的记录重复记录的表表,SQL语句是4,使用组来提高效率