方法一
寫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;
insert /*+ APPEND */ into T3
select T1.* from T1,T2 where T1.ID=T2.ID;
--耗時0.398s (T1--大表增大到100000筆 T2--小表增大到50000筆)