Oracle中大批量刪除資料的方法
Oracle中大批量刪除資料的方法
批量刪除海量資料通常都是很複雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過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/17252115/viewspace-740739/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle刪除重資料方法Oracle
- ORACLE批量刪除無主鍵重複資料Oracle
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- 6.12php對資料庫的刪除和批量刪除PHP資料庫
- win10批量刪除空資料夾的方法Win10
- oracle刪除超過N天資料指令碼的方法Oracle指令碼
- Laravel 批量插入(如果資料存在刪除原資料)Laravel
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- 刪除linux下的oracle資料庫LinuxOracle資料庫
- LINUX 使用批量刪除檔案的幾種方法Linux
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- php(js)批量刪除/單個刪除PHPJS
- windows下Oracle資料庫完全刪除WindowsOracle資料庫
- ORACLE刪除-表分割槽和資料Oracle
- oracle徹底刪除資料檔案Oracle
- Oracle中刪除表中的重複資料Oracle
- 資料夾刪除不了怎麼辦?資料夾刪除不了的解決方法
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫
- 批量刪除 redis keysRedis
- whk我【資料刪除】你個【資料刪除】的
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- Oracle10g刪除資料檔案Oracle
- mssql sqlserver 批量刪除所有儲存過程的方法分享SQLServer儲存過程
- 誤刪除資料了怎麼辦?小編交易誤刪除資料的恢復方法
- 批量刪除容器和映象
- git 批量刪除本地分支Git
- Linux批量刪除檔案Linux
- 如何批量刪除指定的GitHub ReposGithub
- Oracle 刪除千萬級資料量時,可以考慮以下方法來提高刪除效率Oracle
- linux|批量建立檔案、資料夾或刪除——萬用字元Linux字元
- 面試官:Redis中大Key怎麼刪除?面試Redis
- linux下恢復誤刪除oracle的資料檔案LinuxOracle
- oracle大資料量分批刪除Oracle大資料
- oracle批量新增更新資料Oracle
- 刪除資料
- 批量刪除大量小檔案
- linux 模糊批量刪除檔案Linux
- docker 批量刪除容器和映象Docker
- Linux shell 根據時間批量刪除指定資料夾下的檔案Linux