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了有没有什么其他方法啊
删除重复数据的谢谢了
数据量的话 大约是几百万条
我用的是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了有没有什么其他方法啊
删除重复数据的谢谢了
from test b
where a.id= b.id
and a.fppass = b.fppass
and a.id between '0000000001' and '1000000000'汗,你这个没有分组啊有点慢吧应该按ID分组取出单一的ROWID,然后进行其它ID不同ROWID的删除
重新建立一个撤销表空间,然后把撤销表空间切换过去,把旧的给删掉。。
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;
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