对数据库影响最小的批量删除

   工作中遇到一张分钟数据表,数据特别多,1分钟大概要保存1万行数据,对数据库存储容量造成很大影响。需要对这张表进行处理,只保存7天数据1分钟数据,7天前的数据只保留小时数据。同时要求对数据处理时,能数据库性能影响不能太大。

   在网上搜索删除方法时,发现使用bulk collect的limit功能,并使用forall,效果比较好。如下是详细方法。


BULK COLLECT 对大数据DELETE UPDATE的优化

这里举DELETE就可以了,UPDATE同理

举个案例:
需要在一个1亿行的大表中,删除1千万行数据
需求是在对数据库其他应用影响最小的情况下,以最快的速度完成

如果业务无法停止的话,可以参考下列思路:
根据ROWID分片、再利用Rowid排序、批量处理、回表删除
在业务无法停止的时候,选择这种方式,的确是最好的
一般可以控制在每一万行以内提交一次,不会对回滚段造成太大压力
我在做大DML时,通常选择一两千行一提交
选择业务低峰时做,对应用也不至于有太大影响
代码如下:
代码如下:
DECLARE
--按rowid排序的cursor
--删除条件是oo=xx,这个需根据实际情况来定
CURSOR mycursor IS SELECT rowid FROM t WHERE OO=XX ORDER BY rowid;
TYPE rowid_table_type IS TABLE OF rowid index by pls_integer;
v_rowid rowid_table_type;
BEGIN
OPEN mycursor;
LOOP
FETCH mycursor BULK COLLECT INTO v_rowid LIMIT 5000;--5000行提交一次
EXIT WHEN v_rowid.count=0;
FORALL i IN v_rowid.FIRST..v_rowid.LAST
DELETE t WHERE rowid=v_rowid(i);
COMMIT;
END LOOP;
CLOSE mycursor;
END;
/


参考网址:http://www.uplook.cn/database/oracle/167145.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章