一種批量刪除資料的方法

2021-07-29 13:12:33 字數 2194 閱讀 2440

這兩天碰見乙個比較緊急的生產問題,由於還在處理中,所以暫時不能給出整體描述,但其中涉及的乙個問題就是刪除一張大表中的過期歷史資料,針對不同的型別的表可能有不同的解決方法,比如若是按照時間做的分割槽表,drop partition刪除分割槽的操作可能是效率最快的、最簡單的,若是一張普通表則需要有一些索引鍵值為刪除條件,但需要注意的是最好做批量刪除,且一次刪除量不要太多,因為delete操作會將資料前映象儲存在undo回滾表空間,由於占用過多、事務過大、執行時間過長、undo空間過小等一系列問題存在,就有可能會影響正常的交易操作,這話題不是今天的主題。

刪除歷史資料可以使用儲存過程,也可以寫乙個程式來做,區別是儲存過程是直接在資料庫中操作,少了客戶端和資料庫互動的環節,若是需要一些複雜的校驗邏輯,可能寫程式要更方便一些,但也不是絕對的,可能有人認為儲存過程更好,無論什麼方式,能解決問題才是最重要。

eygle大神曾經提供過乙個用於批量刪除資料的儲存過程,在這引用下,版權還是eygle的:),(強調的就是:分批刪除,逐次提交。

create

or replace procedure

delbigtab

(p_tablename in varchar2,

p_condition in varchar2,

p_count in varchar2)as

pragma

autonomous_transaction;

n_delete number:=0;

begin

while

1=1loop

execute immediate

'delete from '||p_tablename||' where '||p_condition||' and rownum <= :rn'

using p_count;

if sql%notfound then

exit;

else

n_delete:=n_delete + sql%rowcount;

endif;

commit;

endloop;

commit;

dbms_output.put_line('finished!');

dbms_output.put_line('totally '||to_char(n_delete)||' records deleted!');

end;

/

這是一可以有引數輸入的儲存過程,分別是:

p_tablename:待刪除表的表名,

p_condition:刪除條件,

p_count:一次刪除的記錄條數,rownum,

而且用了自治事務pragma autonomous_transaction,儲存過程使用commit結尾。

整個邏輯很清晰和透徹,想必各位稍微看看都能明白。

這篇文章中(還介紹了另一種更精細的方法,判斷日誌是否已經歸檔了,避免資料刪除快於日誌歸檔的速度,如果發現尚未完成切換,則sleep一下,等待切換完成,再做下一次刪除。

針對我這個需求,有一些可以改動的地方,由於這張表是乙個按照number值做hash的雜湊分割槽表,所以從效率上看,還可以精確至每個hash分割槽來做刪除,這點是建榮給的建議,另外例子中自治事務我覺得也是可以不用的,因此針對sql語句可以改為如下:

delete

from

table partition (p1) where insert_timeand rownum <= :rn;

即指定分割槽名稱(這可以作為另乙個引數),然後可以通過手工執行,依次用rn=100、1000、5000、10000等幾個值來選擇從時間和刪除量可接受的範圍。總結一下,

1.如果使用儲存過程,或許可以不用自治事務。

2.可以將partition作為另乙個引數。

3.由於這張表資料量太大,即使使用索引條件做count(*)操作時間都很久,因此暫時未知符合條件需要刪除的記錄條數,因此需要根據測試和時間需求,明確rownum使用的可行條數,選擇小值則可能迴圈次數要多,選擇大值則可能迴圈次數少,總之務必要分批刪除、批量提交,避免delete子句對undo表空間的過大影響。

以上只是提供了刪除歷史記錄的一種儲存過程操作的方法,以及針對我的需求做的一些改進,至於會採用何種方法,可能還會根據得到的資訊,有其他需要改進的地方,可能還會使用程式的方法,可能會使用這種儲存過程,待完成後會再做總結了。

NHibernate批量刪除資料的方法

方法一 session.delete 這個方法是最常用的,一共有4個過載的方法 void delete object obj int delete string query int delete string query,object value,itype type int delete stri...

PHP 批量刪除資料的方法分析

sql sql delete from doing where id in 1,2,3,4 資料用逗號隔開。表單 複製 如下 好 id dele post id dele 將會是乙個陣列,雖然說php是弱型別的,但這裡可沒asp弱。asp可以直接 sql delete from doing wher...

redis批量刪除資料

redis本身未提供批量刪除的功能,但我們可以使用下面的技巧批量刪除全部或指定格式的資料。刪除以test開頭的所有key值 redis cli h p 埠 a 密碼 keys test xargs redis cli h p 埠 a 密碼 del 如果是刪除localhost的redis資料,且未設...