批量刪除與更新_20110825

gdutllf2006發表於2011-08-25

 

在工作中,經常需要批量更新、刪除資料,經過少量的變更,速度有很大的提升;

如有一個檔案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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章