批量删除大表中的数据
遇到一个项目问题,需要批量删除垃圾数据表达到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/