Oracle中Merge into用法總結

2021-09-09 06:45:57 字數 1378 閱讀 9288

起因

前段時間,因為涉及到一張表的大資料操作,要同時進行增刪改,我跟師傅想了很多優化辦法,結果都不盡人意。剛開始用的就是原始演算法,先更新現有記錄,再插入滿足要求的其他記錄,最後再刪除多餘記錄,但是少量資料還可以,10w條資料就不行了,前台的超時時間是60s,遠遠無法滿足要求。之後又想辦法將任務進行拆分,根據每條記錄流水號尾字元不同進行拆分,用多個執行緒同時執行,一直拆分成10個任務(尾字元分別為0、1、2、3 ... 9),用十個執行緒同時去執行,但是時間還是很慢,最多處理13w條資料左右,50w條資料就讓人無法忍受了。最後無奈只好把之前的優化全部鏟掉,改為merge into操作,再做了一些優化,將50w條資料的單執行緒耗時縮短到三十多秒,特此,將merge into的用法總結如下:(

有乙個表t,有兩個欄位a、b,我們想在表t中做insert/update,如果條件滿足,則更新t中b的值,否則在t中插入一條記錄。在microsoft的sql語法中,很簡單的一句判斷就可以了,sql server中的語法如下:  

if exists(select 1 from t where t.a='1001' )

update t set t.b=2 where t.a='1001'

else

insert into t(a,b) values('1001',2);

oracle中,要實現相同的功能,要用到merge into來實現(oracle 9i引入的功能),其語法如下:

merge into table_name alias1 

using (table|view|sub_query) alias2

on (join condition)

when matched then

update table_name

set col1 = col_val1,

col2 = col_val2

when not matched then

insert (column_list) values (column_values);

嚴格意義上講,」在乙個同時存在insert和update語法的merge語句中,總共insert/update的記錄數,就是using語句中alias2的記錄數」。所以,要實現上面的功能,可以這樣寫:

merge into t t1

using (select '1001' as a,2 as b from dual) t2

on ( t1.a=t2.a)

when matched then

update set t1.b = t2.b

when not matched then

insert (a,b) values(t2.a,t2.b);

如何將批處理做成類流處理 merge into

例如 隨著人工智慧的不斷發展,機器學習這門技術也越來越重要,很多人都開啟了學習機器學習,本文就介紹了機器學習的基礎內容。需要在前端頁面上設計成實時的資料,但是沒有flink,所以只能把批處理做成類流處理 更新存在的 update employe as em set salary select sal...

oracle中累計求和 oracle累計求和

poj2001 shortest prefixes trie樹應用 沉迷wow又頹了兩天orz,暴雪爸爸要在國服出月卡了.這是要我好好學習嗎?趕緊來刷題了.oj 題目大意是求所有字串裡每乙個字元 硬體相關 jtag介面 jtag joint test action group,聯合測試行動小組 是一...

oracle中累計求和 oracle累計求和

oracle累計求和 將當前行某列的值與前面所有行的此列值相加,即累計求和 方法一 with t as select 1 val from dual union all select 3 from dual union all select 5 from dual union all select ...