中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

性能優化技巧 - 組表數據更新

發布時間:2020-07-10 18:04:07 來源:網絡 閱讀:98 作者:raqsoft 欄目:大數據

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

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

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

尾部更新

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

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

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

原理如下:

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

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

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

?

非時間排序數據

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

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


AB
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)/將數據寫組表

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


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

?

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

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

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

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

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

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


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))/取每日新增數據
3=file("taxMon.ctx").create().append@m(A2)/每日追加

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

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


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


向AI問一下細節

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

AI

博罗县| 赞皇县| 通榆县| 巴马| 柳林县| 本溪市| 宁远县| 遂宁市| 曲靖市| 闻喜县| 卢龙县| 昌图县| 礼泉县| 叙永县| 四子王旗| 宕昌县| 资兴市| 松原市| 黔西县| 垦利县| 扶风县| 右玉县| 武宁县| 道孚县| 化隆| 南城县| 北流市| 大港区| 盖州市| 锡林浩特市| 秭归县| 泸西县| 石阡县| 马龙县| 眉山市| 周至县| 平武县| 商水县| 宜兴市| 左权县| 万州区|