Oracle中大批量刪除資料的方法(轉自)
Oracle中大批量刪除資料的方法
作者:eygle |
English Version
批量刪除海量資料通常都是很複雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。
下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過Delete和For all兩種方法,for all在這裡並沒有帶來效能提高,所以仍然選擇了批量直接刪除。
首先建立一下過程,使用自制事務進行處理:
下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過Delete和For all兩種方法,for all在這裡並沒有帶來效能提高,所以仍然選擇了批量直接刪除。
首先建立一下過程,使用自制事務進行處理:
以下是刪除過程及時間:
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=1 loop 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; end if; commit; end loop; commit; DBMS_OUTPUT.PUT_LINE('Finished!'); DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!'); end;
SQL> create or replace procedure delBigTab 2 ( 3 p_TableName in varchar2, 4 p_Condition in varchar2, 5 p_Count in varchar2 6 ) 7 as 8 pragma autonomous_transaction; 9 n_delete number:=0; 10 begin 11 while 1=1 loop 12 EXECUTE IMMEDIATE 13 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn' 14 USING p_Count; 15 if SQL%NOTFOUND then 16 exit; 17 else 18 n_delete:=n_delete + SQL%ROWCOUNT; 19 end if; 20 commit; 21 end loop; 22 commit; 23 DBMS_OUTPUT.PUT_LINE('Finished!'); 24 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!'); 25 end; 26 / Procedure created. SQL> set timing on SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY; MIN(NUMDLFLOGGUID) ------------------ 11000000 Elapsed: 00:00:00.23 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000'); PL/SQL procedure successfully completed. Elapsed: 00:00:18.54 SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY; MIN(NUMDLFLOGGUID) ------------------ 11100000 Elapsed: 00:00:00.18 SQL> set serveroutput on SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000'); Finished! Totally 96936 records deleted! PL/SQL procedure successfully completed. Elapsed: 00:00:18.61 10萬記錄大約19s SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000'); Finished! Totally 100000 records deleted! PL/SQL procedure successfully completed. Elapsed: 00:00:18.62 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000'); Finished! Totally 100000 records deleted! PL/SQL procedure successfully completed. Elapsed: 00:00:18.85 SQL> SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000'); Finished! Totally 1000000 records deleted! PL/SQL procedure successfully completed. Elapsed: 00:03:13.87 100萬記錄大約3分鐘 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000'); Finished! Totally 6999977 records deleted! PL/SQL procedure successfully completed. Elapsed: 00:27:24.69 700萬大約27分鐘
以上過程僅供參考.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70109/viewspace-687123/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中大批量刪除資料的方法Oracle
- Oracle中大資料量刪除Oracle大資料
- 批量刪除Oracle資料庫的資料Oracle資料庫
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Oracle批量建立、刪除資料庫表Oracle資料庫
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- win10批量刪除空資料夾的方法Win10
- 批量刪除空的資料夾
- oracle刪除重資料方法Oracle
- ORACLE批量刪除無主鍵重複資料Oracle
- oracle批量刪除表Oracle
- 轉:Oracle刪除資料檔案Oracle
- 6.12php對資料庫的刪除和批量刪除PHP資料庫
- oracle 刪除重複資料的幾種方法Oracle
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- 刪除重複資料的幾個方法(轉)
- oracle 批量刪除觸發器Oracle觸發器
- Laravel 批量插入(如果資料存在刪除原資料)Laravel
- Oracle資料庫的BULK COLLECT用法之批量增刪改<轉>Oracle資料庫
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- 批次刪除資料方法
- oracle海量表資料刪除及清理高效方法Oracle
- oracle刪除超過N天資料指令碼的方法Oracle指令碼
- Oracle資料庫意外刪除資料檔案的恢復(轉載)Oracle資料庫
- Oracle 刪除資料檔案Oracle
- 如何刪除oracle資料庫Oracle資料庫
- oracle刪除資料檔案Oracle
- 手工刪除oracle資料庫Oracle資料庫
- php(js)批量刪除/單個刪除PHPJS
- 資料夾刪除不了怎麼辦?資料夾刪除不了的解決方法
- LINUX 使用批量刪除檔案的幾種方法Linux
- 批量刪除死鎖
- hibernate批量刪除
- 表格的批量重新命名與批量刪除
- 誤刪除資料了怎麼辦?小編交易誤刪除資料的恢復方法
- oracle手動刪除資料庫Oracle資料庫
- 手動刪除oracle資料庫Oracle資料庫