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