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