需求
有t1,t2兩張表,通過A字段關(guān)聯(lián)产徊,現(xiàn)在需要在t1表新增字段B昂勒,將t2表中的字段C更新到t1表新增的字段B中。t1表數(shù)據(jù)一千二百萬(wàn)舟铜,t2表數(shù)據(jù)七百萬(wàn)戈盈。
常規(guī)方法
直接使用update來更新字段。
--t1表新增字段B
alter table t1 add ( B varchar2(32));
--將t2表的字段C更新到t1表的B列中
update t1 set B = (select C from t2 where t1.A = t2.A);
在數(shù)據(jù)量較少的時(shí)候谆刨,這種寫法其實(shí)是沒問題的塘娶,簡(jiǎn)潔易懂。但是數(shù)據(jù)量太大的情況則不適用痴荐,在測(cè)試環(huán)境實(shí)際跑了一下血柳,一個(gè)小時(shí)都沒更新完官册,遂放棄生兆。
使用MERGE
merge into是oracle內(nèi)置函數(shù),通常用來處理insertOrUpdate的需求膝宁,如果存在數(shù)據(jù)就update鸦难,如果不存在就insert。也可以只用來更新员淫,速度很快合蔽。
--t1表新增字段B
alter table t1 add ( B varchar2(32));
--通過merger的方式,將B表的column3字段更新到A表的column2列中
merge into t1 Using (select * from t1 ) on (t1.A = t2.A)
when matched then update set t1.B = t2.C
通過這種方式介返,在測(cè)試環(huán)境實(shí)際跑下來十分鐘左右可以更新完成拴事。
merge into的詳細(xì)用法可以參考這篇文章:
Oracle中merge into的使用
使用CTAS
create table as 的方式在之前的使用中,多用于創(chuàng)建備份表圣蝎。因?yàn)檫@次需求才認(rèn)識(shí)到其更多的用法刃宵。性能十分強(qiáng)悍。
--首先使用ctas的方式創(chuàng)建臨時(shí)表
create table temp_A as select t1.*,t2.C from t1 left join t2 on t1.A = t2.A;
--刪除原始表
drop table A;
--將臨時(shí)表重名稱
rename temp_A to A;
--重新創(chuàng)建原表的索引等徘公。牲证。。
create index ......
測(cè)試環(huán)境執(zhí)行下來关面,一分鐘左右可以執(zhí)行完成坦袍。
CTAS的更多用法,可以參考Oracle官網(wǎng)的如下內(nèi)容:
How to Update millions or records in a table
這一段內(nèi)容信息量非常大等太,值得仔細(xì)品讀捂齐。