經(jīng)過前文對數(shù)據(jù)存儲的介紹,大家對RapidsDB的數(shù)據(jù)存儲方面有了一定的認知。同時朋友們可能也會思考,作為新一代的分布式數(shù)據(jù)庫,RapidsDB還有沒有更硬核的優(yōu)化手段?摳細節(jié)能摳出個三室一廳那種?
好!!本文我們就RapidsDB數(shù)據(jù)編碼方面來看如何做到性能加速。
介紹RapidsDB的數(shù)據(jù)編碼,準確地說,是介紹存在磁盤內(nèi)的列存儲表的數(shù)據(jù)編碼。列存儲表的數(shù)據(jù)以多種不同形式編碼存儲,包括字典編碼、游程編碼和值編碼。只有某些編碼可以直接處理,即直接“操作”,如字典編碼、游程編碼和整數(shù)值編碼。
以字典編碼為例,對于只有3個不同值的字符串列的一個段,為每個字符串存儲一個2位的ID號,ID號被用作字典的參考。當存儲在列存儲中時,這些ID被緊緊地打包在一起。請參考以下字典:

當它被存儲到列段中時,可以表示為打包字符串ID的位向量:
●Strings:”red”,”blue”,”green”,”green”,”red”
●Strings IDs:0,2,1,1,0
●Bit vector:00 10 01 01 00 (2 bits per string ID)
作為直接對編碼數(shù)據(jù)進行操作的例子,RapidsDB可以對字符串字典編碼的列段執(zhí)行過濾操作,比如說“t.a=’xyz’”,方法是首先找到字典中每個條目的過濾結果,然后在掃描該段時,查詢執(zhí)行系統(tǒng)簡單地獲取t.a中每個值的編碼ID號,并使用它來查找在字典的初始掃描中計算的該ID的字符串比較結果。這往往比實際情況中的字符串比較要快得多。其他類型的操作也可以直接在編碼數(shù)據(jù)ID值上完成,包括比較進行分組操作所需的ID值。更多細節(jié)可自行拓展了解。
在列存儲掃描之外的RapidsDB中的大多數(shù)查詢處理都是一次一行地完成的。對編碼數(shù)據(jù)的列存儲處理以矢量化的方式完成,其中來自一列的大批量數(shù)據(jù)在一個或多個相對簡單的循環(huán)中處理。與一次一行的處理相比,這些循環(huán)對現(xiàn)在CPU更加友好,通過降低指令數(shù)量,提高了高速緩存使用率,并提高了處理器指令流水線的效率。
基于上述編碼,通過使用特殊的編碼處理技術以及支持英特爾AVX2指令集的處理器上的單指令多數(shù)據(jù)(SIMD)指令,使包括過濾和聚合在內(nèi)的某些操作可以在非常高效的狀態(tài)下運行。
硬件上的SIMD不是編碼數(shù)據(jù)優(yōu)化的唯一核心,即使沒有SIMD的支持,對編碼數(shù)據(jù)的操作性能也會提高幾倍到30倍;使用了SIMD則可以進一步提升性能,帶來至少2-3倍的增益。具體優(yōu)化結果將取決于數(shù)據(jù)及查詢。個別查詢的一些部分可能不需要對編碼數(shù)據(jù)進行操作,因此用戶體驗到的加速效果可能會有所不同。
默認情況下,對數(shù)據(jù)編碼的操作是數(shù)據(jù)庫內(nèi)部自動執(zhí)行的。用戶不需要更改任何設置就能從中受益。對數(shù)據(jù)編碼使用操作是查詢在系統(tǒng)運行時生成的,而不是由查詢優(yōu)化器做出的。
編碼數(shù)據(jù)的查詢優(yōu)化只能在列式表中體現(xiàn),需要具備以下一個或多個組件:
●過濾器Filters
●分組 Group by
●聚合 Aggregates
●聚合表達式
●分組表達式
●整數(shù)列上的Star joins
不管運行中的編碼列不同值的數(shù)量是多少,都可以對編碼數(shù)據(jù)進行優(yōu)化操作。編碼中不同值的數(shù)量越少,優(yōu)化性能越好。這是因為當字典變小時,意味著列存儲數(shù)據(jù)被壓縮到更小的尺寸,進而查找表過程中更容易適配到處理器的高速緩存。
先舉個查詢例子,它通過使用了幾個包含性能優(yōu)化的組件從而在對編碼數(shù)據(jù)的操作中提升了性能:

如果再加上一張列式表f,也可以從編碼數(shù)據(jù)的連接操作中得到性能優(yōu)化。查詢示例:

這個查詢是星型模型Star joins的一個簡單例子。如果用戶使用星型模型Star joins做關聯(lián),并且關聯(lián)鍵是整數(shù)類型,那么查詢就可以在編碼數(shù)據(jù)的操作中得到性能優(yōu)化。簡單說明,這里是使用group by子句和聚合函數(shù)從編碼數(shù)據(jù)的連接操作中加速性能。
●再舉個表關聯(lián)的例子:
這個例子展示了編碼連接的作用:

后面的關聯(lián)查詢在雙核筆記本電腦上,只需要0.02秒算出結果。 注意了,它是對表r做一百萬行的全表掃描,然后與維表d(110行)做連接。
通過查看RapidsDB的圖形計劃或者show profile json的結果輸出,可以了解數(shù)據(jù)編碼功能連接正被用于上述語句配置文件的查詢計劃中:在HashJoin運算符上,可以看到屬性"encoded_join_enabled":"yes"。此外,還可以看到對編碼數(shù)據(jù)的操作被推送到ColumnStoreScan列存掃描運算符。ColumnStoreScan、 HashJoin和各種GroupBy運算符可以在掃描過程中通過一個或多個散列連接(hash joins)的序列來共同實現(xiàn)星型連接(star join)。
●支持的編碼數(shù)據(jù)
目前RapidsDB僅對以下情況支持對編碼數(shù)據(jù)的操作:
●帶有字符串字典和字符串游程編碼的字符串類型;
●具有值和行程編碼的整數(shù)列。
分組、聚合操作僅支持整數(shù)類型做數(shù)據(jù)編碼。過濾支持字符串和整數(shù)類型做編碼數(shù)據(jù)。
通常RapidsDB會自動對列存儲數(shù)據(jù)進行編碼。但是,在極少數(shù)情況下,本該自動編碼的操作沒有被編碼數(shù)據(jù)識別到,但對用戶的應用程序來說,這次數(shù)據(jù)編碼優(yōu)化十分重要,則可以通過option ''符號來實現(xiàn),例如:

●支持的操作和限制
對編碼數(shù)據(jù)支持的操作以及對操作的限制做個詳細分類說明:
●掃描Scan:
●整數(shù)編碼更快解碼
●過濾Filter:
●下列過濾器:
●字符串字典和字符串游程編碼的字符串類型
●用于游程編碼的整數(shù)類型
●過濾器表達式中的“或”運算;篩選器表達式必須包含單個字符串列,以加快處理速度
●支持字符串列上的Bloom篩選器(消除單個字符串列上沒有匹配連接的行)
●聚合Aggregates:
●支持的聚合:sum, min, max, count, any
●支持的聚合數(shù)據(jù)類型:全數(shù)字
●支持的聚合表達式:一個表達式中允許有多個表列
●支持的聚合編碼:整數(shù)、整數(shù)游程編碼
●分組Group-by
●沒有分組的聚合(也稱為標量聚合)不會對編碼數(shù)據(jù)執(zhí)行操作
●分組計數(shù)啟動非?
●分組:
●允許有多個分組列
●允許混合使用列和表達式
●分組列必須僅使用以下編碼:整數(shù)、整數(shù)游程編碼
●每列幾千行不同值的數(shù)量有一個限制,超過這個限制,系統(tǒng)將恢復到一次一行的處理,并且行段的數(shù)據(jù)的本地聚合將向父全局聚合運算符輸出行
●類似的,對幾千個組的組總數(shù)也有一個限制,超過這個限制就不使用優(yōu)化的分組處理
●排序關鍵字上的分組可能不如其他列上的分組高效,因為可以執(zhí)行有序分組,而哈希分組可能更好
●分組的表達式:
●一個表達式中只允許一個輸入列
●表達式結果必須為整數(shù)
●在分組列和表達式集中,每個列表只能使用一次
●關聯(lián)Joins
●連接必須在某種類型的整數(shù)列上,或者在內(nèi)部表示為整數(shù)的另一種列類型上,如datetime
●查詢優(yōu)化器選擇的一個或多個連接必須是HashJoin類型
●連接必須是多對一的關系
●HashJoin(或一些列HashJoin)必須出現(xiàn)在上 ColumnStoreScan
●對連接結果的查詢中必須存在按操作分組和聚合
柏睿數(shù)據(jù)RapidsDB在某國有大行普惠金融項目應用中,對應用開發(fā)人員進行了開發(fā)優(yōu)化建議和幾次針對性查詢優(yōu)化中,就使用了數(shù)據(jù)編碼的方法,取得了明顯的效果:優(yōu)化前后得到5-20倍的效果。
好了,數(shù)據(jù)編碼我們介紹到這。如果您有疑問或建議,歡迎在后臺留言,我們將針對大家的共性問題,發(fā)布【答疑篇】,互動的同學有機會獲得神秘獎品呦。
RapidsDB極限性能數(shù)據(jù)庫有何妙處?第二回將開啟“高性能篇—行列混存”解讀。歡迎關注“柏睿數(shù)據(jù)”公眾號,繼續(xù)修煉數(shù)據(jù)庫~
(新媒體責編:pl0902)
聲明:
1、凡本網(wǎng)注明“人民交通雜志”/人民交通網(wǎng),所有自采新聞(含圖片),如需授權轉載應在授權范圍內(nèi)使用,并注明來源。
2、部分內(nèi)容轉自其他媒體,轉載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責。
3、如因作品內(nèi)容、版權和其他問題需要同本網(wǎng)聯(lián)系的,請在30日內(nèi)進行。電話:010-67683008
人民交通24小時值班手機:17801261553 商務合作:010-67683008轉602 E-mail:zzs@rmjtzz.com
Copyright 人民交通雜志 All Rights Reserved 版權所有 復制必究 百度統(tǒng)計 地址:北京市豐臺區(qū)南三環(huán)東路6號A座四層
增值電信業(yè)務經(jīng)營許可證號:京B2-20201704 本刊法律顧問:北京京師(蘭州)律師事務所 李大偉
京公網(wǎng)安備 11010602130064號 京ICP備18014261號-2 廣播電視節(jié)目制作經(jīng)營許可證:(京)字第16597號