ORACLE批量更新四種方法比較

2021-05-08 19:39:18 字數 3065 閱讀 9908

技術 /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

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批量更新四種方法比較

軟體環境 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...

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