用集算器更新數(shù)據(jù)庫的技巧

對數(shù)據(jù)庫進行批量更新時,使用update函數(shù)要比execute函數(shù)性能更好。

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)通化縣,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

比如,source和target是兩個不同的數(shù)據(jù)源,callrecordA是source中的物理表,有1萬條記錄,callrecordB是target中的物理表,無記錄,現(xiàn)在需要將callrecordA中的數(shù)據(jù)同步到callrecordB中。

當(dāng)使用execute函數(shù)進行批量更新,可以發(fā)現(xiàn)性能不夠理想,代碼如下:


AB
1=connect("source")/連接source
2=A1.query@x("select * from ? callrecordA")/取callrecordA
3

4=connect("target")/連接target
5=A4.execute("truncate table ? callrecordB")/為方便重復(fù)測試,先清空callrecordB
6=now()/記錄測試時間
7=A2.(A4.execute("insert into ? callrecordB ? values(?,?,?,?,?,?)",~.SERIALNUMBER,~.OUTID,~.INID,~.CALLTIME,~.DURATION,~.CHARGE)) ?/批量更新
8=A4.close()
9=interval@ms(A6,now())/SQL execute語句,8251ms

上述算法實際是循環(huán)執(zhí)行insert語句,并沒有充分利用JDBC的批量更新機制,因此性能較差。而且上述算法只是插入數(shù)據(jù),如果既有插入又有修改,處理起來會麻煩許多。

使用update函數(shù)后,可以看到性能提升明顯,代碼如下:

11=connect("target")/連接target
12=A11.execute("truncate table ? callrecordB")/為方便重復(fù)測試,先清空callrecordB
13=now()/記錄測試時間
14=A11.update@i(A2,callrecord;SERIALNUMBER)/批量更新
15=A11.close()
16=interval@ms(A13,now())/SPL update函數(shù),2075ms

函數(shù)update利用JDBC的executeBatch機制進行批量更新,因此性能較好。選項@i表示只需生成insert語句,@u表示只生成update語句。無選項時表示既有insert又有update,即目標(biāo)表已有數(shù)據(jù),需比對源表和目標(biāo)表的主鍵,如果某主鍵在源表存在,在目標(biāo)表不存在,則生成insert語句,如果某主鍵在源表和目標(biāo)表都存在,則生成update語句。

?

數(shù)據(jù)庫通常會提供同步/導(dǎo)入工具,這些工具通常具備更好的性能,也都支持命令行調(diào)用。SPL可執(zhí)行命令行,因此可以調(diào)用這些工具。比如用oracle的sqlldr導(dǎo)入數(shù)據(jù),可使用如下代碼:


AB
1=connect("source")/連接source
2=A1.query@x("select * from ? callrecordA")/取callrecordA
3=file("d:\\temp\\callrecordB.txt").export(A2;"|")/生成文本/csv文件,分隔符為|
4=system("cmd /C? sqlldr system/runqian@orcl ? control=d:\\temp\\callrecordB.ctl data=d:\\temp\\callrecordB.txt log=log.log ? bad=bad.log errors=5000 rows=1000 bindsize=10485760")/執(zhí)行命令行

A1-A3:將source中的表導(dǎo)出成文本文件,分隔符為|。文本文件如果已存在,則可省略本步驟。

A4:執(zhí)行命令行,調(diào)用sqlldr,命令格式要符合sqlldr的官方要求。注意callrecordB.ctl 是sqlldr要求的控制文件,格式如下:

load data

CHARACTERSET UTF8?

append

into table callrecordB

fields terminated by '|'

trailing nullcols

(

SERIALNUMBER INTEGER EXTERNAL,

OUTID INTEGER EXTERNAL,

INID INTEGER EXTERNAL,

CALLTIME date "yyyy-mm-dd ? hh34:mi:ss",

DURATION INTEGER EXTERNAL,

CHARGE INTEGER EXTERNAL

)

SPL支持并行計算,包括并行執(zhí)行同步/導(dǎo)入工具,所以可以將單文本拆成多個文本,同時導(dǎo)入多個文件,以此獲得更高性能。不同的同步/導(dǎo)入工具,有不同的并行要求,通常的要求是不鎖表,且無唯一索引。比如并行執(zhí)行sqlldr,可用如下代碼:


ABC
1=file("d:\\temp\\callrecordB.txt")
/打開單文件
2=2.(file(concat("d:\\temp\\callrecordB",~,".txt")).export(A1.cursor(;~:2,"|");"|"))/拆分成多個文件
3fork to(2)=system(concat("cmd /C? sqlldr system/runqian@orcl ? control=d:\\temp\\callrecordB.ctl ? data=d:\\temp\\callrecordB",A3,".txt direct=y parallel=true ? log=log.log bad=bad.log errors=5000? ? bindsize=10485760"))/多文件并行導(dǎo)入

新聞名稱:用集算器更新數(shù)據(jù)庫的技巧
文章地址:http://muchs.cn/article10/jooodo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃建站公司、ChatGPT、微信小程序、品牌網(wǎng)站設(shè)計、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)