很多时候,我们要清理一个大表的数据,比如几个亿,业务还不能停,还只能delete,这种情况下分批删除是个好办法。


createorreplaceproceduredelBigTab--分批提交删除(p_TableNameinvarchar2,--表名p_Conditioninvarchar2,--条件p_Countinvarchar2--每批提交的条数)aspragmaautonomous_transaction;n_deletenumber:=0;beginwhile1=1loopEXECUTEIMMEDIATE'deletefrom'||p_TableName||'where'||p_Condition||'andrownum<=:rn'USINGp_Count;ifSQL%NOTFOUNDthenexit;elsen_delete:=n_delete+SQL%ROWCOUNT;DBMS_OUTPUT.PUT_LINE(n_delete);endif;commit;endloop;commit;DBMS_OUTPUT.PUT_LINE('Finished!');DBMS_OUTPUT.PUT_LINE('Totally'||to_char(n_delete)||'recordsdeleted!');end;

执行方法:execdelBigTab('XXXXX','status=1','10000');


清理表之后,重新收集下该表的统计信息

EXECUTEdbms_stats.gather_table_stats(ownname=>'XXXX',tabname=>'XXXXXX',estimate_percent=>30,cascade=>true,degree=>4);