批量删除与更新_20110825

 

在工作中,经常需要批量更新、删除数据,经过少量的变更,速度有很大的提升;

如有一个文件number.unl 大概200W的数据量;原表有1000W左右
400785688
400790518
400792204
400816886
400820101
...

现在要用根据这个文件去Delete表数据

以前的做法是生成Update.sql
delete from xxx where subscriberkey=400785688;
delete from xxx where subscriberkey=400785688;
....
速度太慢了,不能满足业务的需求;


新的方案:
通过Rowid来删除:

1 建立中间表,将文件upload到数据库;

建立表结构
Create table mouse_subscriberkey as select a.subscriberkey from cbe_subscriber a where 1=0;

通过sqlldr将数据导入;好像可以通过UTL_FILE包来读取文件,没做过,有时间学习下;

2 建立删除的存储过程;
create or replace procedure mouse_delete_cbe_subscriber
is
type ridArray is table of rowid index by binary_integer;
v_rowid ridArray;
begin
 select a.rowid bulk collect into v_rowid
 from cbe_subscriber a, mouse_subscriberkey b
 where a.subscriberkey=b.subscriberkey
 and rownum < 100001;
 forall i in 1 .. v_rowid.COUNT
   delete from cbe_subscriber where rowid=v_rowid(i);
 dbms_output.put_line('delete rows: '||v_rowid.COUNT);
end;
/

declare
v_total integer := 0;
begin
 select count(*) into v_total from cbe_subscriber a, mouse_subscriberkey b where a.subscriberkey =b.subscriberkey;
while v_total > 0
loop
 execute immediate 'begin mouse_delete_cbe_subscriber; end;';
 commit;
 v_total := v_total - 100000;
end loop;
dbms_output.put_line('Bulk delete complete.');
end;
/

速度有很大的提升;

Update语句也可参考同样的思路;

请使用浏览器的分享功能分享到微信等