oracle大量删除重复数据(无索引)

现有一张表 dmp_result 无主键无索引,DATA_RECORD_ID、ORGANIZATION_ID、DATA_TIME理论上三个唯一,优化此表构建上面3列联合唯一约束,需要删除重复数据;

dmp_result 约数据400W 大约有重复数据3W条

查询表重复数据也就是待删除数据

   select * from dmp_result a
where (a.DATA_RECORD_ID,a.ORGANIZATION_ID,a.DATA_TIME) in   (select DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME from dmp_result group by DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME having
count(*) > 1)
and rowid not in (select min(rowid) from dmp_result group by DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME having count(*)>1)

如果直接执行上述sql delete 执行时间会非常漫长不可取;

可复制两张临时表,一张插入需要删除数据,一张取其差集就是想得到的数据(临时表无约束小心重复导入)

创建临时表dmp_result1、dmp_result2

create table dmp_result1 as select * from dmp_result
create table dmp_result2 as select * from dmp_result

减少日志产生

alter table dmp_result1 nologging; 
alter table dmp_result2 nologging; 

创建临时表dmp_result1插入需要删除数据

  insert /*+ append */ into dmp_result1 (
   select * from dmp_result a
where (a.DATA_RECORD_ID,a.ORGANIZATION_ID,a.DATA_TIME) in   (select DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME from dmp_result group by DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME having
count(*) > 1)
and rowid not in (select min(rowid) from dmp_result group by DATA_RECORD_ID,ORGANIZATION_ID,DATA_TIME having count(*)>1)
  ); 

dmp_result2插入差集

  insert /*+ append */ into dmp_result2 (
select * from dmp_result 
minus select * from dmp_result1
  ); 

后面可以将dmp_result2 更换成 dmp_result,也可以将dmp_result清空后插入dmp_result2的数据即可

重新构建约束

alter table dmp_result rename to dmp_result3;
alter table dmp_result2 rename to dmp_result;

截断表有风险请做好备份

truncate table ems_inspect_record;
  insert /*+ append */ into ems_inspect_record (
select * from ems_inspect_record2
  ); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值