經過前文對數據存儲的介紹,大家對RapidsDB的數據存儲方面有了一定的認知。同時朋友們可能也會思考,作為新一代的分布式數據庫,RapidsDB還有沒有更硬核的優化手段?摳細節能摳出個三室一廳那種?
好!!本文我們就RapidsDB數據編碼方面來看如何做到性能加速。
介紹RapidsDB的數據編碼,準確地說,是介紹存在磁盤內的列存儲表的數據編碼。列存儲表的數據以多種不同形式編碼存儲,包括字典編碼、游程編碼和值編碼。只有某些編碼可以直接處理,即直接“操作”,如字典編碼、游程編碼和整數值編碼。
以字典編碼為例,對于只有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)
作為直接對編碼數據進行操作的例子,RapidsDB可以對字符串字典編碼的列段執行過濾操作,比如說“t.a=’xyz’”,方法是首先找到字典中每個條目的過濾結果,然后在掃描該段時,查詢執行系統簡單地獲取t.a中每個值的編碼ID號,并使用它來查找在字典的初始掃描中計算的該ID的字符串比較結果。這往往比實際情況中的字符串比較要快得多。其他類型的操作也可以直接在編碼數據ID值上完成,包括比較進行分組操作所需的ID值。更多細節可自行拓展了解。
在列存儲掃描之外的RapidsDB中的大多數查詢處理都是一次一行地完成的。對編碼數據的列存儲處理以矢量化的方式完成,其中來自一列的大批量數據在一個或多個相對簡單的循環中處理。與一次一行的處理相比,這些循環對現在CPU更加友好,通過降低指令數量,提高了高速緩存使用率,并提高了處理器指令流水線的效率。
基于上述編碼,通過使用特殊的編碼處理技術以及支持英特爾AVX2指令集的處理器上的單指令多數據(SIMD)指令,使包括過濾和聚合在內的某些操作可以在非常高效的狀態下運行。
硬件上的SIMD不是編碼數據優化的唯一核心,即使沒有SIMD的支持,對編碼數據的操作性能也會提高幾倍到30倍;使用了SIMD則可以進一步提升性能,帶來至少2-3倍的增益。具體優化結果將取決于數據及查詢。個別查詢的一些部分可能不需要對編碼數據進行操作,因此用戶體驗到的加速效果可能會有所不同。
默認情況下,對數據編碼的操作是數據庫內部自動執行的。用戶不需要更改任何設置就能從中受益。對數據編碼使用操作是查詢在系統運行時生成的,而不是由查詢優化器做出的。
編碼數據的查詢優化只能在列式表中體現,需要具備以下一個或多個組件:
●過濾器Filters
●分組 Group by
●聚合 Aggregates
●聚合表達式
●分組表達式
●整數列上的Star joins
不管運行中的編碼列不同值的數量是多少,都可以對編碼數據進行優化操作。編碼中不同值的數量越少,優化性能越好。這是因為當字典變小時,意味著列存儲數據被壓縮到更小的尺寸,進而查找表過程中更容易適配到處理器的高速緩存。
先舉個查詢例子,它通過使用了幾個包含性能優化的組件從而在對編碼數據的操作中提升了性能:
如果再加上一張列式表f,也可以從編碼數據的連接操作中得到性能優化。查詢示例:
這個查詢是星型模型Star joins的一個簡單例子。如果用戶使用星型模型Star joins做關聯,并且關聯鍵是整數類型,那么查詢就可以在編碼數據的操作中得到性能優化。簡單說明,這里是使用group by子句和聚合函數從編碼數據的連接操作中加速性能。
●再舉個表關聯的例子:
這個例子展示了編碼連接的作用:
后面的關聯查詢在雙核筆記本電腦上,只需要0.02秒算出結果。 注意了,它是對表r做一百萬行的全表掃描,然后與維表d(110行)做連接。
通過查看RapidsDB的圖形計劃或者show profile json的結果輸出,可以了解數據編碼功能連接正被用于上述語句配置文件的查詢計劃中:在HashJoin運算符上,可以看到屬性"encoded_join_enabled":"yes"。此外,還可以看到對編碼數據的操作被推送到ColumnStoreScan列存掃描運算符。ColumnStoreScan、 HashJoin和各種GroupBy運算符可以在掃描過程中通過一個或多個散列連接(hash joins)的序列來共同實現星型連接(star join)。
●支持的編碼數據
目前RapidsDB僅對以下情況支持對編碼數據的操作:
●帶有字符串字典和字符串游程編碼的字符串類型;
●具有值和行程編碼的整數列。
分組、聚合操作僅支持整數類型做數據編碼。過濾支持字符串和整數類型做編碼數據。
通常RapidsDB會自動對列存儲數據進行編碼。但是,在極少數情況下,本該自動編碼的操作沒有被編碼數據識別到,但對用戶的應用程序來說,這次數據編碼優化十分重要,則可以通過option ''符號來實現,例如:
●支持的操作和限制
對編碼數據支持的操作以及對操作的限制做個詳細分類說明:
●掃描Scan:
●整數編碼更快解碼
●過濾Filter:
●下列過濾器:
●字符串字典和字符串游程編碼的字符串類型
●用于游程編碼的整數類型
●過濾器表達式中的“或”運算;篩選器表達式必須包含單個字符串列,以加快處理速度
●支持字符串列上的Bloom篩選器(消除單個字符串列上沒有匹配連接的行)
●聚合Aggregates:
●支持的聚合:sum, min, max, count, any
●支持的聚合數據類型:全數字
●支持的聚合表達式:一個表達式中允許有多個表列
●支持的聚合編碼:整數、整數游程編碼
●分組Group-by
●沒有分組的聚合(也稱為標量聚合)不會對編碼數據執行操作
●分組計數啟動非常快
●分組:
●允許有多個分組列
●允許混合使用列和表達式
●分組列必須僅使用以下編碼:整數、整數游程編碼
●每列幾千行不同值的數量有一個限制,超過這個限制,系統將恢復到一次一行的處理,并且行段的數據的本地聚合將向父全局聚合運算符輸出行
●類似的,對幾千個組的組總數也有一個限制,超過這個限制就不使用優化的分組處理
●排序關鍵字上的分組可能不如其他列上的分組高效,因為可以執行有序分組,而哈希分組可能更好
●分組的表達式:
●一個表達式中只允許一個輸入列
●表達式結果必須為整數
●在分組列和表達式集中,每個列表只能使用一次
●關聯Joins
●連接必須在某種類型的整數列上,或者在內部表示為整數的另一種列類型上,如datetime
●查詢優化器選擇的一個或多個連接必須是HashJoin類型
●連接必須是多對一的關系
●HashJoin(或一些列HashJoin)必須出現在上 ColumnStoreScan
●對連接結果的查詢中必須存在按操作分組和聚合
柏睿數據RapidsDB在某國有大行普惠金融項目應用中,對應用開發人員進行了開發優化建議和幾次針對性查詢優化中,就使用了數據編碼的方法,取得了明顯的效果:優化前后得到5-20倍的效果。
好了,數據編碼我們介紹到這。如果您有疑問或建議,歡迎在后臺留言,我們將針對大家的共性問題,發布【答疑篇】,互動的同學有機會獲得神秘獎品呦。
RapidsDB極限性能數據庫有何妙處?第二回將開啟“高性能篇—行列混存”解讀。歡迎關注“柏睿數據”公眾號,繼續修煉數據庫~
(新媒體責編:pl0902)
聲明:
1、凡本網注明“人民交通雜志”/人民交通網,所有自采新聞(含圖片),如需授權轉載應在授權范圍內使用,并注明來源。
2、部分內容轉自其他媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責。
3、如因作品內容、版權和其他問題需要同本網聯系的,請在30日內進行。電話:010-67683008
人民交通24小時值班手機:17801261553 商務合作:010-67683008轉602 E-mail:zzs@rmjtzz.com
Copyright 人民交通雜志 All Rights Reserved 版權所有 復制必究 百度統計 地址:北京市豐臺區南三環東路6號A座四層
增值電信業務經營許可證號:京B2-20201704 本刊法律顧問:北京京師(蘭州)律師事務所 李大偉
京公網安備 11010602130064號 京ICP備18014261號-2 廣播電視節目制作經營許可證:(京)字第16597號