性能優(yōu)化技巧:遍歷復(fù)用提速多次分組

我們知道,大數(shù)據(jù)運(yùn)算性能的瓶頸常常是在外存(也就是硬盤)IO上,因?yàn)橥獯嬖L問性能要比內(nèi)存低一兩個(gè)數(shù)量級(jí)。因此,做性能優(yōu)化時(shí),減少硬盤的訪問量有時(shí)要比減少CPU計(jì)算量更為重要。同一個(gè)任務(wù),如果能使用硬盤訪問量更少的算法,即使CPU計(jì)算量不變甚至略多一點(diǎn),也會(huì)獲得更好的性能。

分組匯總需要對(duì)數(shù)據(jù)集進(jìn)行遍歷。同一個(gè)數(shù)據(jù)集可能會(huì)按不同維度進(jìn)行分組,這樣原則上就要遍歷多次,大數(shù)據(jù)時(shí)就會(huì)涉及多遍硬盤訪問。但是,如果我們能在一次遍歷過程中計(jì)算出多個(gè)維度的分組結(jié)果,那就會(huì)減少很多硬盤訪問量。

可惜,SQL無法寫出這樣的運(yùn)算(在遍歷中返回多個(gè)分組結(jié)果),只能遍歷多次,或者寄希望于數(shù)據(jù)庫引擎是否能優(yōu)化。而SPL則支持這種遍歷復(fù)用的語法,可以一次遍歷計(jì)算出多個(gè)分組結(jié)果,從而提高性能。

下面我們做一下測(cè)試,以O(shè)racle為例看數(shù)據(jù)庫是否會(huì)對(duì)多次遍歷的計(jì)算進(jìn)行優(yōu)化,以及在SPL中采用遍歷復(fù)用算法對(duì)性能的影響。

一、 數(shù)據(jù)準(zhǔn)備和環(huán)境

SPL腳本生成數(shù)據(jù)文件,數(shù)據(jù)共兩列,第一列id是小于20億的隨機(jī)整數(shù),第二列amount是不大于1千萬的隨機(jī)實(shí)數(shù)。數(shù)據(jù)記錄為80億行,生成的原始文本文件大小為169G。利用數(shù)據(jù)庫提供的數(shù)據(jù)導(dǎo)入工具將此文件數(shù)據(jù)導(dǎo)入到Oracle的數(shù)據(jù)表topn中,同時(shí)也用此文件數(shù)據(jù)生成SPL組表文件topn.ctx。

在一臺(tái)Intel服務(wù)器上完成測(cè)試,2個(gè)Intel3014 CPU,主頻1.7G,共12核,內(nèi)存64G。數(shù)據(jù)庫表數(shù)據(jù)及SPL組表文件均存儲(chǔ)在同一塊SSD硬盤上。

這里刻意把數(shù)據(jù)量造得比內(nèi)存大,以保證操作系統(tǒng)不可能把這些數(shù)據(jù)都緩存進(jìn)內(nèi)存,實(shí)際運(yùn)算時(shí)一定會(huì)讀取硬盤。

二、 Oracle測(cè)試

測(cè)試分成三種情況:?jiǎn)畏纸M單倍計(jì)算量、單分組雙倍計(jì)算量、雙分組雙倍計(jì)算量。

1. 單分組單倍計(jì)算量

select /*+ parallel(12) */ mod(id,100) Aid,max(amount) Amax from topn group by mod(id,100)

2. 單分組雙倍計(jì)算量

select /*+ parallel(12) */ mod(id,100)+floor(id/20000000) Aid, max(amount) Amax, min(amount) Amin from topn group by mod(id,100)+floor(id/20000000);

計(jì)算式多了一倍,相當(dāng)于計(jì)算量大了一倍。

3. 雙分組雙倍計(jì)算量

select /*+ parallel(12) */ * from (select mod(id,100) Aid,max(amount) Amax from topn group by mod(id,100) ) A

join

( select floor(id/20000000) Bid,min(amount) Bmin from topn group by floor(id/20000000) ) B

on A.Aid=B.Bid;

這里的計(jì)算量大體與2相同,但有兩個(gè)分組,我們將觀察數(shù)據(jù)庫是否會(huì)進(jìn)行兩次遍歷。最后的JOIN運(yùn)算只涉及100行數(shù)據(jù),時(shí)間可以忽略不計(jì)。

三、 SPL測(cè)試

我們把Oracle做的測(cè)試用SPL再做一遍。

1. 單分組單倍計(jì)算量

編寫SPL腳本執(zhí)行測(cè)試:

2. 單分組雙倍計(jì)算量

編寫SPL腳本執(zhí)行測(cè)試:

3. 雙分組雙倍計(jì)算量

編寫SPL腳本執(zhí)行測(cè)試:

這里采用了SPL特有的遍歷復(fù)用語法,在A3定義了游標(biāo),A4/B4和A5/B5中定義了兩套針對(duì)這個(gè)游標(biāo)的計(jì)算,表示會(huì)在一次游標(biāo)遍歷過程同時(shí)計(jì)算這兩個(gè)結(jié)果。

四、 分析與結(jié)論

三種情況的測(cè)試用時(shí)如下表:

測(cè)試結(jié)果(時(shí)間單位:秒)

從Oracle的測(cè)試結(jié)果上看,雙分組雙倍計(jì)算量比單分組雙倍計(jì)算量慢了近200秒,這不是一個(gè)可以忽略的時(shí)間了,因?yàn)閮烧叩挠?jì)算量幾乎相同,這多出來的時(shí)間估計(jì)就是多做一次遍歷的時(shí)間了。這說明數(shù)據(jù)庫不會(huì)自動(dòng)做遍歷復(fù)用的優(yōu)化,在雙分組時(shí)會(huì)將數(shù)據(jù)表遍歷兩次,結(jié)果多做一次分組幾乎會(huì)多出一倍的時(shí)間。

而SPL采用了遍歷復(fù)用的機(jī)制,三個(gè)測(cè)試的計(jì)算時(shí)間相差很小,多做一次分組并不會(huì)多一次遍歷,只是多了一些復(fù)用控制的邏輯,不會(huì)變慢多少。

說明一下,準(zhǔn)備數(shù)據(jù)時(shí)把Oracle的amount字段類型設(shè)置成decimal了,所以計(jì)算速度比較慢;而SPL組表中用的是double類型,所以要快得多。但這個(gè)測(cè)試不是對(duì)比Oracle和SPL的計(jì)算性能,這些不同并不影響上面的結(jié)論。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、問題背景與適用場(chǎng)景 通常分組計(jì)算都采用hash方案,即先計(jì)算分組字段的hash值,hash值相同的記錄被分揀到...
    小黃鴨呀閱讀 245評(píng)論 0 0
  • 一、問題背景與適用場(chǎng)景 什么是后半有序?如果數(shù)據(jù)集T已經(jīng)按字段a、b有序,現(xiàn)在我們要將T按b排序或分組時(shí),因?yàn)樵赼...
    小黃鴨呀閱讀 228評(píng)論 0 0
  • 問題的提出 BI 系統(tǒng)的常見結(jié)構(gòu)是:前端是 BI 應(yīng)用,負(fù)責(zé)多維分析的用戶操作和結(jié)果呈現(xiàn);后臺(tái)是數(shù)據(jù)庫 / 數(shù)據(jù)倉...
    小黃鴨呀閱讀 715評(píng)論 0 0
  • 【摘要】 日常生活中,我們會(huì)遇到各種各樣的數(shù)據(jù),小到公司通訊錄,大到互聯(lián)網(wǎng)用戶行為分析。在進(jìn)行數(shù)據(jù)分析處理的過程中...
    小黃鴨呀閱讀 426評(píng)論 0 0
  • 1. 常規(guī)分組 當(dāng)分組聚合的結(jié)果集不大時(shí),可以使用groups。例如有學(xué)生成績(jī)表存儲(chǔ)在集文件中,表結(jié)構(gòu)如下: 現(xiàn)在...
    小黃鴨呀閱讀 280評(píng)論 0 0

友情鏈接更多精彩內(nèi)容