性能優(yōu)化技巧:有序分組

一、 問題背景與適用場(chǎng)景

通常分組計(jì)算都采用hash方案,即先計(jì)算分組字段的hash值,hash值相同的記錄被分揀到一個(gè)小集合里,然后在這個(gè)小集合中遍歷找分組字段值相同的聚合成一組。分組的復(fù)雜度(比較次數(shù)),取決于hash函數(shù)的重碼率。在hash空間比較小時(shí),重碼率就高,比較次數(shù)就會(huì)多,性能會(huì)受較大影響。為了提高性能,就需要分配較大的內(nèi)存來存放 hash 表。另外,有些數(shù)據(jù)類型(長(zhǎng)字串)的 hash 計(jì)算也比較慢,這也會(huì)影響性能。

如果分組字段是有序的,在分組的時(shí)候,每條記錄只與上一條記錄比較,發(fā)現(xiàn)有不同時(shí)則新建一個(gè)分組,相同則聚合到當(dāng)前組中。這樣的分組運(yùn)算的復(fù)雜度為n(被分組集合的長(zhǎng)度),而且沒有 hash 計(jì)算和重碼率的問題,可以獲得比 hash 分組更快的性能,而且并不需要太多內(nèi)存用于存放 hash 表。

SPL提供了這種分組方法,我們實(shí)例測(cè)試一下,并且與使用hash分組算法的Oracle對(duì)比。

二、 測(cè)試環(huán)境

測(cè)試機(jī)有兩個(gè)Intel2670 CPU,主頻2.6G,共16核,內(nèi)存64G,SSD固態(tài)硬盤。在此機(jī)上安裝虛擬機(jī)來測(cè)試,設(shè)置虛擬機(jī)為16核、8G內(nèi)存。

三、 小數(shù)據(jù)量小結(jié)果集測(cè)試

在虛擬機(jī)上創(chuàng)建數(shù)據(jù)表orderdetail_1,共三個(gè)字段:orderid(整數(shù))、detailid(整數(shù))、amount(實(shí)數(shù)),前兩個(gè)字段是主鍵,生成數(shù)據(jù)記錄8千萬(wàn)行。將此表數(shù)據(jù)導(dǎo)入Oracle數(shù)據(jù)庫(kù),同時(shí)用它生成集算器SPL組表來進(jìn)行測(cè)試。

orderid字段數(shù)據(jù)升序排列,按orderid進(jìn)行分組,共有50組,統(tǒng)計(jì)每張訂單的總金額和明細(xì)條數(shù)。

1. Oracle測(cè)試

編寫查詢測(cè)試SQL如下:

select /*+ parallel(n) */

orderid, sum(amount) as amount, count(detailid) as details

from orderdetail_1

group by orderid;

其中/*+ parallel(n) */ 用于并行測(cè)試,n為并行數(shù)。

2. SPL測(cè)試

編寫SPL腳本如下:

groups分組時(shí)加選項(xiàng)@o就適用分組字段有序時(shí),只比較相鄰行的值進(jìn)行有序分組。

3. 測(cè)試結(jié)果

測(cè)試結(jié)果如下,單位(秒):

在8千萬(wàn)行數(shù)據(jù)的情況下,SPL有序分組的性能提高了一倍左右,并且并行的效果非常好,性能呈線性上升。而使用hash分組的Oracle并行提速效果并不明顯。

性能提高程序與數(shù)據(jù)量有關(guān),當(dāng)數(shù)據(jù)量很小時(shí),分組時(shí)間占整個(gè)查詢時(shí)間的比例很小,對(duì)整體性能的提高也就不明顯。但隨著數(shù)據(jù)量的增加,提升效果就會(huì)越來越顯著。

下面我們?cè)賮砜纯创髷?shù)據(jù)量測(cè)試的情況。

四、 大數(shù)據(jù)量大結(jié)果集測(cè)試

在虛擬機(jī)上創(chuàng)建數(shù)據(jù)表orderdetail_2,共三個(gè)字段:orderid(字符串)、detailid(整數(shù))、amount(實(shí)數(shù)),前兩個(gè)字段是主鍵,生成數(shù)據(jù)記錄24億行。將此表數(shù)據(jù)導(dǎo)入Oracle數(shù)據(jù)庫(kù),同時(shí)用它生成集算器SPL組表來進(jìn)行測(cè)試。

orderid字段數(shù)據(jù)升序排列,按orderid進(jìn)行分組,共有8億組,統(tǒng)計(jì)每張訂單的總金額和明細(xì)條數(shù)。由于查詢出的大結(jié)果集在Oracle輸出需要很長(zhǎng)的時(shí)間,所以對(duì)分組結(jié)果再進(jìn)行一次過濾,只輸出訂單總金額小于35元的訂單,結(jié)果只有12條,輸出就幾乎不占時(shí)間了。

1. Oracle測(cè)試

編寫查詢測(cè)試SQL如下:

select * from (

select /*+ parallel(n) */

orderid, sum(amount) sum_amount, count(detailid) as details

from orderdetail_2

group by orderid

)

where sum_amount<35;

其中/*+ parallel(n) */ 用于并行測(cè)試,n為并行數(shù)。

2. SPL測(cè)試

編寫SPL腳本如下:

由于分組結(jié)果集很大,無法全部裝載到內(nèi)存,所以使用group函數(shù)進(jìn)行有序分組,返回分組結(jié)果集對(duì)應(yīng)的游標(biāo),再對(duì)游標(biāo)過濾后取得需要的查詢結(jié)果。

3. 測(cè)試結(jié)果

測(cè)試結(jié)果如下,單位(秒):

在不并行的情況下,SPL有序分組比Oracle性能提升了近6倍左右。因SPL有序分組方法很適合并行,隨著并行數(shù)的增加,性能提升的效果就越好。

?著作權(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值相同的記錄被分揀到...
    小黃鴨呀閱讀 241評(píng)論 0 0
  • 一、問題背景與適用場(chǎng)景 什么是后半有序?如果數(shù)據(jù)集T已經(jīng)按字段a、b有序,現(xiàn)在我們要將T按b排序或分組時(shí),因?yàn)樵赼...
    小黃鴨呀閱讀 227評(píng)論 0 0
  • 問題的提出 BI 系統(tǒng)的常見結(jié)構(gòu)是:前端是 BI 應(yīng)用,負(fù)責(zé)多維分析的用戶操作和結(jié)果呈現(xiàn);后臺(tái)是數(shù)據(jù)庫(kù) / 數(shù)據(jù)倉(cāng)...
    小黃鴨呀閱讀 715評(píng)論 0 0
  • 我們知道,大數(shù)據(jù)運(yùn)算性能的瓶頸常常是在外存(也就是硬盤)IO上,因?yàn)橥獯嬖L問性能要比內(nèi)存低一兩個(gè)數(shù)量級(jí)。因此,做性...
    小黃鴨呀閱讀 354評(píng)論 0 0
  • 一、 問題背景與適用場(chǎng)景 在以前的文章中我們介紹過,關(guān)系數(shù)據(jù)庫(kù)在進(jìn)行表間關(guān)聯(lián)時(shí)是使用HASH分段技術(shù)。設(shè)兩個(gè)關(guān)聯(lián)表...
    小黃鴨呀閱讀 262評(píng)論 0 0

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