更新大批量數(shù)據(jù)的背景:
用戶需要將VIP的微信標(biāo)識,傳給用戶的ERP會員檔案中,已知存量數(shù)據(jù)約50W行數(shù)據(jù),線下的微信標(biāo)識數(shù)據(jù)我們開發(fā)提供了openid和erpid的csv文件,erpid和線下的會員檔案id對應(yīng),需要將openid也更新到會員檔案里。
更新數(shù)量大致分為兩大步驟
一、將我們要更新的數(shù)據(jù)源導(dǎo)入數(shù)據(jù)庫內(nèi),需要創(chuàng)建臨時表,將數(shù)據(jù)傳入臨時表
二、寫游標(biāo),將臨時表內(nèi)的數(shù)據(jù)與需要更新的數(shù)據(jù)進行更新
1.將csv文件里面的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫臨時表中,先創(chuàng)建臨時表
create table vip_openid
(erpid number(10),
openid varchar(200)
)
2.臨時表創(chuàng)建后,將cvs文件里的數(shù)據(jù)導(dǎo)入表中,在這里我們選擇工具>文本導(dǎo)入器
選擇要導(dǎo)入的csv文件,注意csv文件的表字段和數(shù)據(jù)庫表字段對應(yīng)
選擇文件后在界面將會預(yù)覽導(dǎo)入的數(shù)據(jù)
3.點擊到oracle的數(shù)據(jù),選擇導(dǎo)入的表,先選擇用戶名,用戶名下的表名,然后選擇表與csv文件表字段對應(yīng)關(guān)系,我們選擇導(dǎo)入,可以看到提示導(dǎo)入完成。
4.接下來就是對會員表和臨時表的數(shù)據(jù)關(guān)聯(lián)更新,我們先使用直接update方式進行更新試驗,該方法只更新5W數(shù)據(jù),耗時12分鐘左右:
于是參考百度文檔建議,寫了一個游標(biāo)如下
declare
cursor cur is--聲明游標(biāo)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對應(yīng)的openid,并對游標(biāo)內(nèi)數(shù)組排序
V_COUNTER NUMBER;--聲明一個number類型的變量
BEGIN
V_VOUNTER:=0;--初始化變量值為0
FOR ROW IN CUR LOOP--遍歷游標(biāo)
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時候,就提交給數(shù)據(jù)庫
提交后將變量歸零,繼續(xù)下一個1000行更新
END IF;
END LOOP;
COMMIT;
END;
大概48W行數(shù)據(jù),43秒即更新完畢。
使用以上方式注意一點,因為數(shù)據(jù)庫會員表的ID有索引,所以使用游標(biāo)速率很快。如我們的多表關(guān)聯(lián)字段沒有索引,使用此方式可能效果不是很明顯。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
您可能感興趣的文章:- Oracle批量插入數(shù)據(jù)的三種方式【推薦】
- C# Oracle批量插入數(shù)據(jù)進度條的實現(xiàn)代碼
- Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼
- MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)
- Oracle兩張表關(guān)聯(lián)批量更新其中一張表的數(shù)據(jù)
- Oracle批量查詢、刪除、更新使用BULK COLLECT提高效率
- mybatis執(zhí)行批量更新batch update 的方法(oracle,mysql兩種)
- Oracle批量導(dǎo)入文本文件快速的方法(sqlldr實現(xiàn))
- Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法
- Java實現(xiàn)mybatis批量插入數(shù)據(jù)到Oracle
- Oracle批量執(zhí)行sql語句之禁用所有表的外鍵
- oracle+mybatis 使用動態(tài)Sql當(dāng)插入字段不確定的情況下實現(xiàn)批量insert
- Oracle 高速批量數(shù)據(jù)加載工具sql*loader使用說明