您好,登錄后才能下訂單哦!
組表是集算器提供的高性能存儲格式,其原理在于將數據事先排序并以壓縮方式緊致存儲,好處是占用空間更小,可利用有序進行快速定位。
但這種存儲方式在數據更新時會遇到麻煩,這是因為新數據也要和歷史數據一起排序并壓縮,常常會要求重寫整個組表,重寫操作非常耗時,但又不得不做。
不過,有些場景下卻有高性能的數據更新手段,我們來看一下。
我們知道,組表允許修改少量數據。但修改量積累較多時,就要做一下reset(重整),否則會影響運算性能(因為修改部分無法緊致壓縮存儲,細節原理可參考其它文檔)。
但是reset動作相當于重寫整個組表,在組表很大時就會花費大量時間。有沒有更快的手段呢?
如果組表中修改的記錄都是近期的(鍵順序靠后),則重整組表時可以使用reset@q,能夠大幅度減少重整時間。
原理如下:
如前所述,組表數據分成了兩個區域:緊致且高效的正文區、松散且低效的補充區,修改的數據只存放在補充區,并不會改動正文區。執行reset時將重寫整個文件,把補充區數據和正文區合并。而reset@q時,組表會先在正文區找到重整位置(補充區中最早被修改的記錄位置),將該位置之后的數據與補充區合并整理就可以了。
比如組文件以時間為鍵,存儲了1-12月的數據,其中12月份的數據有改動。執行reset@q時,不會動前11月的數據,只將12月份的正文區數據和補充區合并,在重整過程中,只涉及12這1個月的數據。
如果不用@q選項,組表在reset時會把1-12月數據全部重寫一遍,涉及12個月的數據,時間就會長很多。
?
按賬戶查詢歷史記錄是很常見的需求,我們只需把數據按帳戶排序,就能獲得較好的查詢性能,即使并發較多也可以支持。
比如下面代碼,將歷史報稅單按帳戶排序并生成組表:
A | B | |
1 | =orcl.curosr@x("select * from tax ? where declareTime >=? order by cardNo , declareTime",date("2019-01-01 ?")) | /按順序取業務數據 |
2 | =file("taxHis.ctx").create(#cardNo, ? #declareTime, tax, area, declaretype, unit, network) | /新建組表 |
3 | =A2.append(A1) | /將數據寫組表 |
然后基于這個有序的組表,按帳戶查詢就能獲得很好的性能:
A | B | |
1 | =file("taxHis.ctx") | /組表對象 |
2 | =A1.create().cursor(;cardNo=="010319760818002X") | /查詢組表 |
?
但是,生產系統會源源不斷產生新增數據,而這些新增數據卻不是按賬戶排序的(一般來講會按產生時間為序)。如果要將新增數據也加入到歷史中,就需要將兩者歸并排序。
組表提供了append@m函數,可以自動將新增數據與歷史數據歸并排序,但它的時間成本卻相當大,因為即使歸并排序也需要將歷史數據全部重寫一遍 ,而歷史數據往往非常巨大。
那么,有什么好辦法能減少歸并排序的時間,從而提高數據更新的性能呢?
使用組表文件組可以解決該問題。
文件組原理是將多個同構文件模擬成一個文件,該文件在邏輯上可當作普通文件使用,即支持普通文件所有的函數。特別地,文件組還支持自動歸并。我們可以把數據分為歷史組表和增量組表兩個文件,查詢時使用這兩個文件構成的文件組,這相當于對一個組表進行查詢。每次定時更新時只對增量組表做小歸并,這樣可以提高日常更新的性能。而積累到一定程度后,才將增量組表和歷史組表做一次大歸并。
比如報稅單日增10萬條,可在每天執行如下腳本,用來處理新增數據:
A | B | C | |
1 | if 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)) | /取每日新增數據 | |
3 | =file("taxMon.ctx").create().append@m(A2) | /每日追加 |
上述代碼中taxMonth.ctx是增量組表,最多存儲一個月的數據,每天新增數據會追加到該組表中,月初再將該組表與歷史組表taxHis.ctx合并。函數reset@m用于重整文件組,可將所有數據寫入第一個組表中,并清空其他組表中的數據。函數append@m可將同構同序的游標以歸并方式追加到組表中。
實現業務計算時,可將歷史組表與增量組表在邏輯上合并,以文件組的形式進行查詢,其性能和單一組表文件相差不大。代碼如下:
A | B | |
1 | =file(["taxHis.ctx","taxMon.ctx"]) | /創建文件組 |
2 | =A1.create().cursor(;cardNo=="010319760818002X") | /查詢 |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。