Oracle删除大表数据慢,大表删除数据特别慢的sql(修改:重复记录只有50条)

再看看tom提供的这个方法,也不错

You Asked

Tom,

I am interested in finding the fastest way to save off

the duplicate records to a duplicates table.  My source

table has about 13 million rows and the users want to remove

all duplicates from the primary table and store them in a

duplicates table for later review.  (I know, not exactly the

smartest thing to do.  However, I have not control over this).

I expect there to be a relatively low number of dups.

(less than 1%).  Here is what I have come up with.

create table dup_rowids

as

(select rowid

from table_a

minus

select Max(rowid)

from table_a

group by A, B, C);

Using this list, I can then create table for those records

that are dups and those records that are unique

Am I on the right track?

Thanks,

Jim

and we said...

how about adding a unique constraint on the columns in question and using "exceptions

into".  For example:

ops$tkyte@ORA817DEV.US.ORACLE.COM> create table t ( a int, b int, c int );

Table created.

ops$tkyte@ORA817DEV.US.ORACLE.COM> exec gen_data( 'T', 500 );

PL/SQL procedure successfully completed.

ops$tkyte@ORA817DEV.US.ORACLE.COM> insert into t select * from t where rownum < 10;

9 rows created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>

ops$tkyte@ORA817DEV.US.ORACLE.COM> create table exceptions(row_id rowid,

2                          owner varchar2(30),

3                          table_name varchar2(30),

4                          constraint varchar2(30));

Table created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>

ops$tkyte@ORA817DEV.US.ORACLE.COM> alter table t add constraint t_unique unique(a,b,c)

exceptions into exceptions;

alter table t add constraint t_unique unique(a,b,c) exceptions into exceptions

*

ERROR at line 1:

ORA-02299: cannot validate (OPS$TKYTE.T_UNIQUE) - duplicate keys found

ops$tkyte@ORA817DEV.US.ORACLE.COM>

ops$tkyte@ORA817DEV.US.ORACLE.COM> create table dups

2  as

3  select *

4    from t

5   where rowid in ( select row_id from exceptions )

6  /

create table dups

*

ERROR at line 1:

ORA-00955: name is already used by an existing object

ops$tkyte@ORA817DEV.US.ORACLE.COM> delete from t where rowid in ( select row_id from

exceptions );

18 rows deleted.

ops$tkyte@ORA817DEV.US.ORACLE.COM> insert into t select distinct * from dups;

9 rows created.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值