ORACLE資料庫更新大批量資料案例
阿新 • • 發佈:2018-12-18
更新大批量資料的背景: 使用者需要將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有索引,所以使用遊標速率很快。如我們的多表關聯欄位沒有索引,使用此方式可能效果不是很明顯。