批量删除大表中的数据

批量删除大表中的数据

遇到一个项目问题,需要批量删除垃圾数据表达到9000W,由于有主子表关系,使用存储过程:

CREATE OR REPLACE PROCEDURE  DEL_TABLE  AS

      V_PK VARCHAR2(20);

      V_SQL VARCHAR2(500);

      CURSOR CUR_1 IS -- 游标

      select pk  from  table1 ;

 

      BEGIN

      DBMS_OUTPUT.ENABLE (buffer_size=>100000);

 

      OPEN CUR_1 ;

      LOOP

      FETCH CUR_1 INTO V_PK;

      EXIT WHEN CUR_1 %NOTFOUND;

 

      begin

      V_SQL:='delete from table2 where dr=1 and pk='''|| V_PK ||'''';

      EXECUTE IMMEDIATE V_SQL;

      dbms_output.put_line('EXECUTE: '||V_SQL||' OK!');

      commit;

      EXCEPTION

      WHEN OTHERS THEN

      dbms_output.put_line('EXECUTE: '||V_SQL||' ERROR!');

      end;

      END LOOP;

      CLOSE CUR_GLORGBOOK ;

 

 

      IF CUR_GLORGBOOK%ISOPEN THEN

      CLOSE CUR_GLORGBOOK;

      END IF;

 

      END;

 

执行此存储过程,效率过低,找人帮忙后优化的存储过程:

create table table1_bak(rn int,pk_glorgbook varchar2(30));

insert into table1_bak ( select pk from table1_bak);

commit;

CREATE OR REPLACE PROCEDURE DEL_TABLE(r1 int,r2 int)

 AS

      V_PK VARCHAR2(20);

      V_SQL VARCHAR2(500);

      CURSOR CUR_1 IS -- 游标

      select pk  from  table1 where rn>=r1 and rn<=r2;

      BEGIN

      DBMS_OUTPUT.ENABLE (buffer_size=>100000);

      OPEN CUR_1 ;

      LOOP

      FETCH CUR_1 INTO DEL_TABLE;

      EXIT WHEN CUR_1 %NOTFOUND;

      begin

      V_SQL:= 'delete from table2 where dr=1 and pk='''|| V_PK ||'''';

      EXECUTE IMMEDIATE V_SQL;

      dbms_output.put_line('EXECUTE: '||V_SQL||' OK!');

      commit;

      EXCEPTION

      WHEN OTHERS THEN

      dbms_output.put_line('EXECUTE: '||V_SQL||' ERROR!');

      end;

      END LOOP;

      CLOSE CUR_1 ;

      IF CUR_GLORGBOOK%ISOPEN THEN

      CLOSE CUR_1

      END IF;

      END;

 

调用:

 

exec DEL_TABLE(1,100);

exec DEL_TABLE(101,200);

exec DEL_TABLE(201,300);

exec DEL_TABLE(301,400);

exec DEL_TABLE(401,500);

exec DEL_TABLE(501,600);

exec DEL_TABLE(601,700);

exec DEL_TABLE(701,800);

exec DEL_TABLE(801,900);

exec DEL_TABLE(901,1000);

.....

类似

 

使用存储过程删除数据后需要对表重新move,于是想到了:

将表备份:

expdp dumpfile=table2_dr.dmp logfile=table2_dr.log query=table2:'"where dr!=1"'

将表备份的同时,抛弃了不用的数据。

 

不知道还有什么更好的方法

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/795969/viewspace-625629/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/795969/viewspace-625629/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值