Oracle並行更新的兩種方式(merge/update內聯視圖)


對於Oracle的兩表聯合更新的場景(有AB兩表,以A.id=B.id關聯,根據B表中的記錄更新A表中的相應字段),一般有update內聯視圖和merge兩種方式,下面舉例介紹:

 

創建用例表:

create table test1(id number(10),name varchar2(20));

create table test2(id number(10),name varchar2(20));

 

測試數據:

begin

insert into test1 values(1,'A');

insert into test1 values(2,'B');

 

insert into test2 values(1,'C');

insert into test2 values(2,'D');

end;

 

 

merge方式:

merge into test1 using test2

on (test1.id = test2.id)

when matched then update

set test1.name = nvl2(test1.name,test2.name,test1.name);

 

merge方法是最簡潔,效率最高的方式,在大數據量更新時優先使用這種方式。

 

 

update內聯視圖方式:

使用這種方式必須在test2.id上有主鍵(這里很好理解,必須保證每一個test1.id對應在test2里只有一條記錄,如果test2中有多條對應的記錄,怎么更新test1?),一般而言這種方式代價比merge方式稍高。

alter table test2 add constraint pk_test2 primary key(id);  --/*+ BYPASS_UJVC */

 

update (select /*+ BYPASS_UJVC */a.id aid,a.name aname,b.id bid,b.name bname from test1 a,test2 b where a.id=b.id) t

set aname = nvl2(aname,bname,aname);

 

 

 

使用並行,加快大量數據更新:

merge /*+parallel(test1,4)*/ into test1 using test2

on (test1.id = test2.id)

when matched then update

set test1.name = nvl2(test1.name,test2.name,test1.name);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM