對數據庫影響最小的批量刪除

   工作中遇到一張分鐘數據表,數據特別多,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

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