ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 批量删除与更新_20110825

批量删除与更新_20110825

原创 Linux操作系统 作者:gdutllf2006 时间:2011-08-25 20:21:46 0 删除 编辑

 

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

如有一个文件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语句也可参考同样的思路;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10248702/viewspace-705812/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-08

  • 博文量
    133
  • 访问量
    396087