關於千萬級資料刪除的問題

2022-08-19 02:30:09 字數 2656 閱讀 8732

關於千萬級資料我個人認為資料量已經不小了,然而資料刪除資料是一件很頭痛的事情,因為平常僅僅只用delete 操作發現在刪除資料未結束之前是不釋放記憶體的導致刪除失敗,經過大量的時間查詢,想過使用truncate 方法刪除不能儲存日誌並且也不能加條件進行刪除,導致也不得不放棄。最後我經過很長一段時間查詢**,發現游標刪除資料時候可以解決資料刪除不釋放記憶體的問題,那就是每每刪除1000條資料就提交一次事務來釋放記憶體。**如下

方法1declare

cursor [del_cursor] is select a.*, a.rowid row_id from [table_name] a order by a.rowid;

begin

for v_cusor in [del_cursor] loop

if v_cusor.[time_stamp] < to_date('2014-01-01','yyyy-mm-dd') then

delete from [table_name] where rowid = v_cusor.row_id;

end if;

if mod([del_cursor]%rowcount,1000)=0 then

commit;

end if;

end loop;

commit;

end;

方法1中變數說明:

[del_cursor] 游標名

[table_name] 你要刪除資料的表名

[time_stamp] 你用作過濾條件的表的時間欄位名稱

方法2declare  

maxrows number default 1000;

delete_ct number default 0;

begin

select count(1)/maxrows  into delete_ct from [table_name] where [time_stamp] < to_date('2014-01-01','yyyy-mm-dd');

for i in 1..trunc(delete_ct)+1

loop

delete [table_name] where [time_stamp] < to_date('2014-01-01','yyyy-mm-dd') and rownum <= maxrows;

commit;

end loop ;

end;

方法2中變數說明:

[table_name] 你要刪除資料的表名

[time_stamp] 你用作過濾條件的表的時間欄位名稱

note

兩種方法的核心的思路都是把乙個大事物拆分成了若干個小事物,無論採用哪種方法,都建議先在對應的測試環境中測試後再考慮是否可以在實際生產使用。

順便說一句,這樣的大表應該要綜合考慮下是否可以改造成分割槽表。

這是乙個中間儲存函式

另外下面為了方便讀者,我特意將delete 與truncate的區別給大家羅列出來。

1.delete from後面可以寫條件,truncate不可以。

2.delete from記錄是一條條刪的,所刪除的每行記錄都會進日誌,而truncate一次性刪掉整個頁,因此日至裡面只記錄頁釋放,簡言之,delete from更新日誌,truncate基本不,所用的事務日誌空間較少。

3.delete from刪空表後,會保留乙個空的頁,truncate在表中不會留有任何頁。

4.當使用行鎖執行 delete 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。

5.如果有identity產生的自增id列,delete from後仍然從上次的數開始增加,即種子不變,而truncate後,種子會恢復初始。

6.truncate不會觸發delete的觸發器,因為truncate操作不記錄各個行刪除。

總結 1.truncate和 delete只刪除資料不刪除表的結構(定義) 

drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger),索引(index); 依賴於該錶的儲存過程/函式將保留,但是變為invalid狀態。

2.delete語句是dml,這個操作會放到rollback segement中,事務提交之後才生效;如果有相應的trigger,執行的時候將被觸發 

truncate,drop是ddl, 操作立即生效,原資料不放到rollback segment中,不能回滾. 操作不觸發trigger。

3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動 

顯然drop語句將表所占用的空間全部釋放 

truncate 語句預設情況下見空間釋放到 minextents個 extent,除非使用reuse storage; truncate會將高水線復位(回到最開始)。

4.速度,一般來說: drop> truncate > delete。

5.安全性:小心使用drop 和truncate,尤其沒有備份的時候.否則哭都來不及。

6.使用上,想刪除部分資料行用delete,注意帶上where子句. 回滾段要足夠大. 想刪除表,當然用drop 

想保留表而將所有資料刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發trigger,還是用delete 

如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新匯入/插入資料。

千萬級 百萬級資料刪除優化

在mysql上面刪除大量資料 千萬級 由於不是清空資料,故不能使用truncate 語句 有個truncate可參考 mysql delete語句與truncate table語句 在正常delete下,刪除十分緩慢 由於索引的原因,每次刪除都要相應的更新索引,越往後索引碎片越多,即越往後越慢 完整...

千萬級 百萬級資料刪除優化

在mysql上面刪除大量資料 千萬級 由於不是清空資料,故不能使用truncate 語句 有個truncate可參考 mysql delete語句與truncate table語句 在正常delete下,刪除十分緩慢 由於索引的原因,每次刪除都要相應的更新索引,越往後索引碎片越多,即越往後越慢 完整...

Python處理千萬級資料

從別人的 裡找到要用的資料的原始資料自己做過濾 搗鼓了兩天覺得 太慢開始用pandas做處理 不得不說最大的感觸就是 pandas 以及numpy在一定程度上在還原matlab 比如matlab中利用邏輯值取數 元素的用法,pandas中有幾乎一樣的方法 test 同時pandas中有很多很好用的方...