oracle里面有没有什么高效的删除重复数据的方法啊
数据量的话 大约是几百万条
我用的是oracle 10g的数据库我用
delete from test a
 where rowid != (select max(rowid)
  from test b
  where a.id= b.id
  and a.fppass = b.fppass 
  and a.id between '0000000001' and '1000000000')
这个语句删除  但是执行速度很慢
而且执行了以后就把oracle给搞死了 
原因好像是  
UNDOTBS01.DBF  
这个文件太大已经30个G了有没有什么其他方法啊
删除重复数据的谢谢了

解决方案 »

  1.   

    select max(rowid)
      from test b
      where a.id= b.id
      and a.fppass = b.fppass  
      and a.id between '0000000001' and '1000000000'汗,你这个没有分组啊有点慢吧应该按ID分组取出单一的ROWID,然后进行其它ID不同ROWID的删除
      

  2.   

    参考http://xdw1626.javaeye.com/blog/344455
      

  3.   

    兄弟,你把a.id between '0000000001' and '1000000000'这个范围搞小点
    重新建立一个撤销表空间,然后把撤销表空间切换过去,把旧的给删掉。。
      

  4.   

    如果使用TRUNCATE 的话 这个语句的写法直接把delete换成TRUNCATE 就行了嘛??
      

  5.   

    --1.先create 
    CREATE TABLE test1 AS
      SELECT *
        FROM test a
       WHERE NOT EXISTS (SELECT 1
                FROM test b
               WHERE a.id = b.id
                 AND a.fppass = b.fppass
                 AND a.id BETWEEN '0000000001' AND '1000000000'
                 AND b.rowid > a.rowid);--2.再rename
    rename test1 to test;
      

  6.   

    表太大,可以在创建时加上nologging吧
      

  7.   

    delete from test a
     where not exists (select 1
      from test b
      where a.id= b.id 
      and a.fppass = b.fppass  and a.rowid>b.rowid 
      and a.id between '0000000001' and '1000000000')--要么重建表 置为NOLOGGING 在装载 在改表名
    create table newtb as select * from test where 1<>1
    alter table newtb nologginginsert /*+ append */ into newtb select * from test a
     where not exists (select 1
      from test b
      where a.id= b.id 
      and a.fppass = b.fppass  and a.rowid<b.rowid 
      and a.id between '0000000001' and '1000000000')
    rename newtb to oldtb