最近做報表專案遇到乙個棘手問題,需要把舊系統的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 第一種就是普通的迴圈每條資料進行更新,這種方式最大的問題就是效率問題,逐條更新,每次都會連線資料庫,然後更新,再釋放連線資源 雖然通過連線池可以將頻繁連線資料的效率大大提高,抗不住資料量大 這中損耗在資料量較大的時候便會體現出效率問題。這也是在滿足業務需求的時候...