對數(shù)據(jù)庫進(jìn)行批量更新時,使用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ù)進(jìn)行批量更新,可以發(fā)現(xiàn)性能不夠理想,代碼如下:
A | B | |
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的批量更新機(jī)制,因此性能較差。而且上述算法只是插入數(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機(jī)制進(jìn)行批量更新,因此性能較好。選項@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ù),可使用如下代碼:
A | B | |
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,可用如下代碼:
A | B | C | |
1 | =file("d:\\temp\\callrecordB.txt") | /打開單文件 | |
2 | =2.(file(concat("d:\\temp\\callrecordB",~,".txt")).export(A1.cursor(;~:2,"|");"|")) | /拆分成多個文件 | |
3 | fork 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://jinyejixie.com/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)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)