ORACLE批量更新四種方法比較

2021-06-22 06:11:23 字數 2572 閱讀 4582

現在我們有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 a

where 1=0;

-- create/recreate primary, unique and foreign key constraints

alter table t2

add constraint t2_pk_id primary key (id);

select rownum id, a.*

from all_objects a where rownum<=5000;

--t1有10000筆資料          

create table t1

asselect rownum sid, t2.*

from t2

where 1=0;

-- create/recreate primary, unique and foreign key constraints

alter table t1

add constraint t1_fk_id foreign key (id)

references t2 (id);

select rownum sid, t2.*

from t2;

select rownum sid, t2.*

from t2;

--更新subobject_name欄位,之前為null

update t2 set t2.subobject_name='stevenhuang'

我們希望能把t1的subobject_name欄位也全部更新成'stevenhuang',也就是說t1的10000筆資料都會得到更新

方法一寫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」錯誤退出

方法二.

用loop迴圈,分批操作

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

方法三.

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

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筆)

方法四.

--由於update是比較消耗資源的操作,會有redo和undo操作,在這個例子裡面我們可以換用下面的方法,建立一張新錶,因為採用insert比update快的多,之後你會有一張舊表和一張新錶,然後要怎麼做就具體情況具體分析了~~~~~

create table t3 as select * from t1 where rownum<1;

alter table t3 nologging;

select t1.* from t1,t2 where t1.id=t2.id;

--耗時0.398s (t1--大表增大到100000筆 t2--小表增大到50000筆)

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...