ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 批量删除大表中的数据

批量删除大表中的数据

原创 Linux操作系统 作者:albaba 时间:2010-01-20 21:01:39 0 删除 编辑

批量删除大表中的数据

遇到一个项目问题,需要批量删除垃圾数据表达到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博客 ” ,链接:https://blog.itpub.net/795969/viewspace-625629/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-10-13

  • 博文量
    9
  • 访问量
    23504