oracle批量刪除
阿新 • • 發佈:2019-01-02
專案中有個需求需要每個月末定時去刪除一張表裡的歷史資料,
剛開始就寫了一個簡單的delete語句,然後起一個JOB定時去呼叫,
後來被告知歷史資料量很大,所以從效能和安全上考慮對sql進行了如下修改:
declare cursor ID_KEY_CURSOR is select ID_KEY from X_TABLE where X_COLUMN = "xxx" begin for V_TO_DEL in ID_KEY_CURSOR loop delete X_TABLE where ID_KEY = V_TO_DEL.ID_KEY if mod(ID_KEY_CURSOR%Rowcount, 5000) = 0 then commit; end if; end loop; commit; end;
將處理的資料每5000筆提交一次,分批處理;
ID_KEY可以是X_TABLE的主鍵,也可以是ROW_ID;
上面的方法使用了遊標,迴圈開啟遊標會影響一定的效能
下面是一種效率更高的方法
begin
loop
delete from table_name
where column_name = 'xxx'
and rownum <=5000;
exit when sql%notfound;
commit;
end loop;
end;