Oracle數據庫更新大批量數據案例
更新大批量數據的背景:
用戶需要將VIP的微信標識,傳給用戶的ERP會員檔案中,已知存量數據約50W行數據,線下的微信標識數據我們開發(fā)提供了openid和erpid的csv文件,erpid和線下的會員檔案id對應,需要將openid也更新到會員檔案里。
更新數量大致分為兩大步驟
一、將我們要更新的數據源導入數據庫內,需要創(chuàng)建臨時表,將數據傳入臨時表
二、寫游標,將臨時表內的數據與需要更新的數據進行更新
1.將csv文件里面的數據導入數據庫臨時表中,先創(chuàng)建臨時表
create table vip_openid (erpid number(10), openid varchar(200) )
2.臨時表創(chuàng)建后,將cvs文件里的數據導入表中,在這里我們選擇工具>文本導入器
選擇要導入的csv文件,注意csv文件的表字段和數據庫表字段對應
選擇文件后在界面將會預覽導入的數據
3.點擊到oracle的數據,選擇導入的表,先選擇用戶名,用戶名下的表名,然后選擇表與csv文件表字段對應關系,我們選擇導入,可以看到提示導入完成。
4.接下來就是對會員表和臨時表的數據關聯更新,我們先使用直接update方式進行更新試驗,該方法只更新5W數據,耗時12分鐘左右:
于是參考百度文檔建議,寫了一個游標如下
declare cursor cur is--聲明游標cur select B.openid,A.ID ROW_ID FROM C_CLIENT_VIP A ,VIP_OPENID B WHERE A.ID=B.ERPID ORDER BY A.ID;--從A和B表中找到ID對應的openid,并對游標內數組排序 V_COUNTER NUMBER;--聲明一個number類型的變量 BEGIN V_VOUNTER:=0;--初始化變量值為0 FOR ROW IN CUR LOOP--遍歷游標 UPDATE C_CLIENT_VIP A SET A.OPENID=ROW.OPENID WHERE A.ID=ROW_ID; V_COUNTER:=V_COUNTER+1;--每次循環(huán)變量值+1 IF(V_COUNTER>=1000) THEN COMMIT; V_COUNTER:=0;--每更新1000行,V_COUNTER值為1000時候,就提交給數據庫 提交后將變量歸零,繼續(xù)下一個1000行更新 END IF; END LOOP; COMMIT; END;
大概48W行數據,43秒即更新完畢。
使用以上方式注意一點,因為數據庫會員表的ID有索引,所以使用游標速率很快。如我們的多表關聯字段沒有索引,使用此方式可能效果不是很明顯。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
oracle臨時表空間的作用與創(chuàng)建及相關操作詳解
Oracle可能會需要使用到一些臨時存儲空間,用于臨時保存解析過的查詢語句以及在排序過程中產生的臨時數據,下面這篇文章主要給大家介紹了關于oracle臨時表空間的作用與創(chuàng)建及相關操作的相關資料,需要的朋友可以參考下2022-07-07oracle11g客戶端連接12c服務器ORA-01017錯誤問題解決
這篇文章主要介紹了oracle11g客戶端連接12c服務器ORA-01017錯誤,本文給大家分享完美解決方法,對oracle 12c錯誤ORA-01017問題解決方法感興趣的朋友跟隨小編一起看看吧2023-06-06Kettle連接Oracle數據庫方法((Oracle19c&Oracle11g))
這篇文章主要介紹了Kettle連接Oracle數據庫方法((Oracle19c&Oracle11g)),包括oracle驅動jar包,連接oracle的過程,思路很簡單需要的朋友可以參考下2022-11-11