批量刪除海量數據通常都是很復雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。
下面是我的刪除過程,我的數據表可以通過主鍵刪除,測試過Delete和For all兩種方法,for all在這裡並沒有帶來性能提高,所以仍然選擇了批量直接刪除。
首先創建一下過程,使用自制事務進行處理:
create or replace procedure delBigTab ( p_TableName in varchar2, p_Condition in varchar2, p_Count in varchar2 ) as pragma autonomous_transaction; n_delete number:=0; begin while 1=1 loop EXECUTE IMMEDIATE 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn' USING p_Count; if SQL%NOTFOUND then exit; else n_delete:=n_delete + SQL%ROWCOUNT; end if; commit; end loop; commit; DBMS_OUTPUT.PUT_LINE('Finished!'); DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!'); end;