ORACLE批量更新三種方法比較

2021-07-04 09:48:06 字數 2554 閱讀 7602

oracle批量更新三種方法比較(2008-05-30 11:55:46)

標籤:雜談  

資料庫:oracle 9i  測試工具:pl/sql

定義2張測試表:t1,t2

t1--大表 10000條 t1_fk_id

t2--小表 5000條  t2_pk_id

t1通過表中字段id與t2的主鍵id關聯

模擬資料如下:

--t2有5000條記錄

create table t2 as select rownum id, a.* from all_objects a where 1=0;

//t2表的字段和all_objects表字段型別以及預設值一致,但索引初始化了,需要重新設定

--建立主鍵id,向t2表copy資料

alter table t2 add constraint t2_pk_id primary key (id);

insert into t2 select rownum id, a.* from all_objects a where rownum<=5000;

--t1有10000條記錄          

create table t1 as select rownum sid, t2.* from t2 where 1=0;

-- 建立外來鍵id,向t1表copy資料

alter table t1 add constraint t1_fk_id foreign key (id) references t2 (id);

insert into t1 select rownum sid, t2.* from t2;

insert into t1 select rownum sid, t2.* from t2;

--更新subobject_name欄位,初始為null

update t2 set t2.subobject_name='stevenhuang'

需求:我們希望能把t1表的subobject_name欄位也全部更新成'stevenhuang',也就是說t1的10000條記錄都會得到更新,以下sql語句均在pl/sql命令視窗測試。

方法一:

寫pl/sql,開cursor

declare

l_varid varchar2(20);

l_varsubname varchar2(30);

cursor mycur is select t2.id,t2.subobject_name from t2;

begin

open mycur;

loop

fetch mycur into l_varid,l_varsubname;

exit when mycur %notfound;

update t1 set t1.subobject_name = l_varsubname where t1.id = l_varid;

end loop;

close mycur;

end;

---耗時39.716s

顯然這是最傳統的方法,如果資料量巨大的話(4000萬記),還會報」snapshot too old」錯誤退出,pl/sql工具會掛掉

方法二:

用loop迴圈,分批update

declare

i number;

j number;

begin

i := 1;

j := 0;

select count(*) into j from t1;

loop

exit when i > j;

update t1 set t1.subobject_name = (select t2.subobject_name from t2 where t1.id = t2.id) where t1.id >= i and t1.id <

(i + 1000);

i := i + 1000;

end loop;

end;

--耗時0.656s,這裡一共迴圈了10次,如果資料量巨大的話,雖然能夠完成任務,但是速度還是不能令人滿意。(例如我們將t1--大表增大到100000記錄 t2--小表增大到50000記錄,將耗時10.139s)

方法三:

--虛擬一張表來進行操作,在資料量大的情況下效率比方法二高很多.

注:此語句下t1,t2表中必須有相應的主外建關聯,否則sql編譯不能通過.

update (select t1.subobject_name a1,t2.subobject_name b1 from t1,t2 where t1.id=t2.id) set a1=b1;

--耗時3.234s (t1--大表增大到100000記錄 t2--小表增大到50000記錄)

*以上所有操作都已經將分析執行計畫所需的時間排除在外

批量更新乙個資料表帶條件的多個字段,用乙個sql語句完成,不建議使用游標或者多次關聯資料表的方式:

update table1 a set (a,b)=(select b.a,b.b from table2 b where a.pk=b.pk ) where a.date='yyyymmdd';commit

ORACLE批量更新四種方法比較

現在我們有2張表 如下 t1 大表 10000筆 t1 fk id t2 小表 5000筆 t2 pk id t1通過表中字段id與t2的主鍵id關聯 模擬資料如下 t2 有5000 筆資料 create table t2 asselect rownum id,a.from all objects ...

ORACLE批量更新四種方法比較

技術 alexlin 發表於2007 11 28,17 39 現在我們有2張表 如下 t1 大表 10000筆 t1 fk id t2 小表 5000筆 t2 pk id t1通過表中字段id與t2的主鍵id關聯 模擬資料如下 t2 有5000 筆資料 create table t2 asselec...

ORACLE批量更新四種方法比較

軟體環境 windows 2000 oracle9i 硬體環境 cpu 1.8g ram 512m 現在我們有2張表 如下 t1 大表 10000筆 t1 fk id t2 小表 5000筆 t2 pk id t1通過表中字段id與t2的主鍵id關聯 模擬資料如下 t2 有5000 筆資料creat...