项目中有个需求需要每个月末定时去删除一张表里的历史数据,
刚开始就写了一个简单的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;