PLSQL 批量更新資料效率問題

2021-08-17 20:07:34 字數 2057 閱讀 6936

最近做報表專案遇到乙個棘手問題,需要把舊系統的30w條資料更新到oracle資料庫中,舊系統的資料儲存在excel裡面,結構如下:

vipno

sssssss1aa

aaa2

bbbb

......

資料庫的表t結構類似,但是我需要根據excel裡面的vipno更新新oracle資料庫sss 和 ssss列。其中t.vipno上建有索引

嘗試過好幾種方法,效率和工作量都不一樣,特此記錄下來

首先想到的方法是,大不了生成30w條update語句,一一更新每行資料唄,反正以前也這麼幹過。

直接在excel裡面用concatenate公式拼接出update語句,

update t set sss='aa', ssss='aaa' where vipno = '1';

一拉30w條update搞定。直接copy到plsql 視窗裡,按execute, 然後整個視窗卡在那裡。後來我也嘗試過1000條update,都會卡住。我已經對vipno去重,所以不應該出現重複update但未commit鎖住的情況。

後來放在伺服器上跑了一夜,一直是卡住,也不報記憶體滿等問題,此方法不可行。

將update語句放在begin end 語句塊中,每句update後加commit:

begin

update t set sss='aa', ssss='aaa' where vipno = '1';

commit;

...end;

一次加10000句,2s左右,可以接受。一次性執行30w,報快取滿的error。 這個方法也不太好,要不就要寫指令碼分30次分別執行10000句update。

利用plsql 將excel表匯入資料庫,再連表批量更新。

匹配好列就可以匯入。30w+條大概20分鐘導完,再在t2.userid上建個索引。

用一下語句更新:

update t 

set (t.sss,t.ssss) = (select t2.sss,t2.ssss from t2 where t2.userid = t.userid)

where exists (select 1 from t2 where t2.userid = t.userid);

commit;

然而還是很慢,一直是executing 狀態,無法知道更新到多少行,所以無法知道大概用多久時間。

方法四:

仍然利用導進來的資料, 用游標方式進行更新,每更新一句就commit。

declare

cursor vi_cursor is (select * from t);

vi_row vi_cursor%rowtype;

begin

for vi_row in vi_cursor loop

update t

set (t.sss,t.ssss) = (

select t2.sss,t2.ssss from t2

where t2.userid= vi_row.userid

)where t.userid = vi_row.userid;

commit;

end loop;

end;

這樣可以在另一視窗用select count(1) 看到更新的資料量,大概30min更新了4w條,至少可以看到進度,沒那麼著急。

我還沒有找到更好的辦法,希望有類似經驗的分享一下,謝謝

批量更新資料問題

同事最近遇到乙個需要根據索引字段更新狀態資料的需求,而這個處理邏輯是迴圈查詢單條更新解決 主要 如下 簡寫 foreach array as v 主體思想是迴圈陣列,進行更新,這樣的話就是要一條條的update,這樣資料多了以後總感覺執行過於緩慢,會給資料庫帶來壓力,於是我查了查資料,找到了乙個批量...

批量更新資料

update bs storage setstoreqty storeqty a.mqty from select nb disbill.companyid,goodsid,nb disbill.outstoreid,outstorepos,mqty,nb disbill.billno from n...

mybatis大批量資料批量更新高效率解決辦法

mybatis批量更新有兩種方式 1 第一種就是普通的迴圈每條資料進行更新,這種方式最大的問題就是效率問題,逐條更新,每次都會連線資料庫,然後更新,再釋放連線資源 雖然通過連線池可以將頻繁連線資料的效率大大提高,抗不住資料量大 這中損耗在資料量較大的時候便會體現出效率問題。這也是在滿足業務需求的時候...