Oracle中大批量删除数据的方法(通过主键删除)
来源:互联网 发布:cdma类的网络 编辑:程序博客网 时间:2024/05/22 06:33
批量删除海量数据通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交。
参见http://blog.csdn.net/robbie1314520/article/details/7816006
下面是另一种删除过程,我的数据表可以通过主键删除,测试过Delete和For all两种方法,for all在这里并没有带来性能提高,所以仍然选择了批量直接删除。
create or replace procedure delBigTab(p_TableName in varchar2,p_Condition in varchar2,p_Count in varchar2)aspragma autonomous_transaction;n_delete number:=0;beginwhile 1=1 loopEXECUTE IMMEDIATE'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'USING p_Count;if SQL%NOTFOUND thenexit;elsen_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 onSQL> select min(ID) from DEVICE_LOG;MIN(NUMDLFLOGGUID)------------------ 11000000Elapsed: 00:00:00.23SQL> exec delBigTab('DEVICE_LOG','ID < 11100000','10000');PL/SQL procedure successfully completed.Elapsed: 00:00:18.54SQL> select min(ID) from DEVICE_LOG;MIN(ID)------------------ 11100000Elapsed: 00:00:00.18SQL> set serveroutput onSQL> exec delBigTab('DEVICE_LOG','ID < 11200000','10000');Finished!Totally 96936 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.61
10万记录大约19s
SQL> exec delBigTab('DEVICE_LOG','ID < 11300000','10000');Finished!Totally 100000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.62SQL> exec delBigTab('DEVICE_LOG','ID < 11400000','10000');Finished!Totally 100000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.85SQL> SQL> exec delBigTab('DEVICE_LOG','ID < 13000000','10000');Finished!Totally 1000000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:03:13.87
100万记录大约3分钟
SQL> exec delBigTab('DEVICE_LOG','ID < 20000000','10000'); Finished!Totally 6999977 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:27:24.69
700万大约27分钟
- Oracle中大批量删除数据的方法(通过主键删除)
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法
- Oracle中大批量删除数据的方法 作者:eygle
- ORACLE大批量数据最快的删除方法
- Oracle大批量删除数据方法
- 【oracle】关于大批量数据删除
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- 大批量数据删除的几种方法PK
- Oracle中删除一列数据的方法
- MySQL删除大批量数据
- adb logcat 查看日志
- Android 4.0 framework源码修改编译,模拟器运行不起来——解决
- VS2010 继承目录编辑
- Oracle中批量删除数据
- 在Visual Studio 2010中配置VC++目录
- Oracle中大批量删除数据的方法(通过主键删除)
- C语言的const关键字与指针搭配使用
- 举例说明在android中用PhoneStateListener监听手机电话状态与用发送邮件来通知来电电话的号码
- windows文件夹不能在VMWARE共享的解决办法
- get_user_pages — 获取用户区进程使用内存的某个页
- pthread_exit()
- 面试 Servlet生命周期
- web应用中不可少的json的使用
- Qt简单实例[自用].Ubuntu平台