Oracle數據庫更新大批量數據案例

今天小編就爲大家分享一篇關於Oracle數據庫更新大批量數據案例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

更新大批量數據的背景:

用戶需要將VIP的微信標識,傳給用戶的ERP會員檔案中,已知存量數據約50W行數據,線下的微信標識數據我們開發提供了openid和erpid的csv文件,erpid和線下的會員檔案id對應,需要將openid也更新到會員檔案裏。

更新數量大致分爲兩大步驟

一、將我們要更新的數據源導入數據庫內,需要創建臨時表,將數據傳入臨時表
二、寫遊標,將臨時表內的數據與需要更新的數據進行更新

1.將csv文件裏面的數據導入數據庫臨時表中,先創建臨時表

create table vip_openid
(erpid number(10),
 openid varchar(200)
)

2.臨時表創建後,將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;--每次循環變量值+1
  IF(V_COUNTER>=1000) THEN
    COMMIT;
    V_COUNTER:=0;--每更新1000行,V_COUNTER值爲1000時候,就提交給數據庫
    提交後將變量歸零,繼續下一個1000行更新
  END IF;
 END LOOP;
  COMMIT;
END;


大概48W行數據,43秒即更新完畢。

使用以上方式注意一點,因爲數據庫會員表的ID有索引,所以使用遊標速率很快。如我們的多表關聯字段沒有索引,使用此方式可能效果不是很明顯。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章