溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

性能優(yōu)化技巧 - 組表數(shù)據(jù)更新

發(fā)布時間:2020-07-10 18:04:07 來源:網(wǎng)絡 閱讀:89 作者:raqsoft 欄目:大數(shù)據(jù)

組表是集算器提供的高性能存儲格式,其原理在于將數(shù)據(jù)事先排序并以壓縮方式緊致存儲,好處是占用空間更小,可利用有序進行快速定位。

但這種存儲方式在數(shù)據(jù)更新時會遇到麻煩,這是因為新數(shù)據(jù)也要和歷史數(shù)據(jù)一起排序并壓縮,常常會要求重寫整個組表,重寫操作非常耗時,但又不得不做。

不過,有些場景下卻有高性能的數(shù)據(jù)更新手段,我們來看一下。

尾部更新

我們知道,組表允許修改少量數(shù)據(jù)。但修改量積累較多時,就要做一下reset(重整),否則會影響運算性能(因為修改部分無法緊致壓縮存儲,細節(jié)原理可參考其它文檔)。

但是reset動作相當于重寫整個組表,在組表很大時就會花費大量時間。有沒有更快的手段呢?

如果組表中修改的記錄都是近期的(鍵順序靠后),則重整組表時可以使用reset@q,能夠大幅度減少重整時間。

原理如下:

如前所述,組表數(shù)據(jù)分成了兩個區(qū)域:緊致且高效的正文區(qū)、松散且低效的補充區(qū),修改的數(shù)據(jù)只存放在補充區(qū),并不會改動正文區(qū)。執(zhí)行reset時將重寫整個文件,把補充區(qū)數(shù)據(jù)和正文區(qū)合并。而reset@q時,組表會先在正文區(qū)找到重整位置(補充區(qū)中最早被修改的記錄位置),將該位置之后的數(shù)據(jù)與補充區(qū)合并整理就可以了。

比如組文件以時間為鍵,存儲了1-12月的數(shù)據(jù),其中12月份的數(shù)據(jù)有改動。執(zhí)行reset@q時,不會動前11月的數(shù)據(jù),只將12月份的正文區(qū)數(shù)據(jù)和補充區(qū)合并,在重整過程中,只涉及12這1個月的數(shù)據(jù)。

如果不用@q選項,組表在reset時會把1-12月數(shù)據(jù)全部重寫一遍,涉及12個月的數(shù)據(jù),時間就會長很多。

?

非時間排序數(shù)據(jù)

按賬戶查詢歷史記錄是很常見的需求,我們只需把數(shù)據(jù)按帳戶排序,就能獲得較好的查詢性能,即使并發(fā)較多也可以支持。

比如下面代碼,將歷史報稅單按帳戶排序并生成組表:


AB
1=orcl.curosr@x("select * from tax ? where declareTime >=? order by cardNo , declareTime",date("2019-01-01 ?"))/按順序取業(yè)務數(shù)據(jù)
2=file("taxHis.ctx").create(#cardNo, ? #declareTime, tax, area, declaretype, unit, network)/新建組表
3=A2.append(A1)/將數(shù)據(jù)寫組表

然后基于這個有序的組表,按帳戶查詢就能獲得很好的性能:


AB
1=file("taxHis.ctx")/組表對象
2=A1.create().cursor(;cardNo=="010319760818002X")/查詢組表 

?

但是,生產(chǎn)系統(tǒng)會源源不斷產(chǎn)生新增數(shù)據(jù),而這些新增數(shù)據(jù)卻不是按賬戶排序的(一般來講會按產(chǎn)生時間為序)。如果要將新增數(shù)據(jù)也加入到歷史中,就需要將兩者歸并排序。

組表提供了append@m函數(shù),可以自動將新增數(shù)據(jù)與歷史數(shù)據(jù)歸并排序,但它的時間成本卻相當大,因為即使歸并排序也需要將歷史數(shù)據(jù)全部重寫一遍 ,而歷史數(shù)據(jù)往往非常巨大。

那么,有什么好辦法能減少歸并排序的時間,從而提高數(shù)據(jù)更新的性能呢?

使用組表文件組可以解決該問題。

文件組原理是將多個同構文件模擬成一個文件,該文件在邏輯上可當作普通文件使用,即支持普通文件所有的函數(shù)。特別地,文件組還支持自動歸并。我們可以把數(shù)據(jù)分為歷史組表和增量組表兩個文件,查詢時使用這兩個文件構成的文件組,這相當于對一個組表進行查詢。每次定時更新時只對增量組表做小歸并,這樣可以提高日常更新的性能。而積累到一定程度后,才將增量組表和歷史組表做一次大歸并。

比如報稅單日增10萬條,可在每天執(zhí)行如下腳本,用來處理新增數(shù)據(jù):


ABC
1if day(now())==1=file(["taxHis.ctx","taxMon.ctx"]).reset@m()/月初重整
2=orcl.curosr@x("select * from tax ? where declareTime >=? and declareTime <? order by cardNo , declareTime ?", datetime(date(now())),elapse(datetime(date(now())),-1))/取每日新增數(shù)據(jù)
3=file("taxMon.ctx").create().append@m(A2)/每日追加

上述代碼中taxMonth.ctx是增量組表,最多存儲一個月的數(shù)據(jù),每天新增數(shù)據(jù)會追加到該組表中,月初再將該組表與歷史組表taxHis.ctx合并。函數(shù)reset@m用于重整文件組,可將所有數(shù)據(jù)寫入第一個組表中,并清空其他組表中的數(shù)據(jù)。函數(shù)append@m可將同構同序的游標以歸并方式追加到組表中。

實現(xiàn)業(yè)務計算時,可將歷史組表與增量組表在邏輯上合并,以文件組的形式進行查詢,其性能和單一組表文件相差不大。代碼如下:


AB
1=file(["taxHis.ctx","taxMon.ctx"])/創(chuàng)建文件組
2=A1.create().cursor(;cardNo=="010319760818002X")/查詢 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI