当前位置: 代码迷 >> Oracle开发 >> ORACLE剔除重复记录求优化
  详细解决方案

ORACLE剔除重复记录求优化

热度:230   发布时间:2016-04-24 06:24:07.0
ORACLE删除重复记录求优化
  DELETE
    FROM   "table"
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table"
                         GROUP BY
                                "aaa",
                                "bbb",
                                "ccc"
                         HAVING COUNT(*) >= 1);

很普通的一条去重复语句,但是当数据量大时(两三万条记录),执行时间要几个小时,但这时执行括号内的查询很快
求优化方案
------解决思路----------------------
引用:
Quote: 引用:

说几点,第一点,在oracle里如果数据量大尽量别用not in,可以用left join然后判断从表主键为null的方式代替
第二点,你这个语句不知道是否写错了,不然完全没有意义,rowid明明是从table表select出来的,又not in,这个很矛盾
第三点,如果数据量大了对用到的条件列建索引提高查询速度是个解决办法

谢谢,数据量其实测试的时候也就不到四万的样子,但是做一次删除要将近两个小时,三四万的数据量对ORACLE来说应该是很小的数据了,而且执行括号内的语句很快,而且我把DELETE换成SELECT * 也很快可以得到结果
所以我总结:DELETE这条语句执行起来比SELECT要费时,导致变慢的原因主要在这里

另:not in前的rowid和后面的集合是进行选择比较,应该没有问题,但用not in效率确实会不高



sql逻辑没问题,not in确实效率会低,考虑换成not exists试试,另外按照你的描述,select很快,delete很慢,如果差距真的很大,可以考虑用存储过程,开游标查询,然后根据rowid循环删除,应该会比现在的直接delete快。
------解决思路----------------------
试试这个
delete from table
 where rowid in (select aa
                   from (select rowid aa,
                                row_number() over(partition by aaa, bbb, ccc order by a.aaa desc) rn,
                                a.*
                           from table a
                         
                         )
                  where rn > 1);
  相关解决方案