技術經(jīng)驗分享:漫談OceanBase 列式存儲
列式存儲主要的目的有兩個:
大部分OLAP查詢只需要讀取部分列而不是全部列數(shù)據(jù),列式存儲可以避免讀取無用數(shù)據(jù);
將同一列的數(shù)據(jù)在物理上存放在一起,能夠極大地提高數(shù)據(jù)壓縮率。
OLAP和OLTP
OLAP,也叫聯(lián)機分析處理(Online Analytical Processing)系統(tǒng),有的時候也叫DSS決策支持系統(tǒng),就是我們說的數(shù)據(jù)倉庫。在這樣的系統(tǒng)中,語句的執(zhí)行量不是考核標準,因為一條語句的執(zhí)行時間可能會非常長,讀取的數(shù)據(jù)也非常多。所以,在這樣的系統(tǒng)中,考核的標準往往是磁盤子系統(tǒng)的吞吐量(帶寬),如能達到多少MB/s的流量。
在OLAP系統(tǒng)中,常使用分區(qū)技術、并行技術。
分區(qū)技術在OLAP系統(tǒng)中的重要性主要體現(xiàn)在數(shù)據(jù)庫管理上,比如數(shù)據(jù)庫加載,可以通過分區(qū)交換的方式實現(xiàn),備份可以通過備份分區(qū)表空間實現(xiàn),刪除數(shù)據(jù)可以通過分區(qū)進行刪除,至于分區(qū)在性能上的影響,它可以使得一些大表的掃描變得很快(只掃描單個分區(qū))。另外,如果分區(qū)結合并行的話,也可以使得整個表的掃描會變得很快。總之,分區(qū)主要的功能是管理上的方便性,它并不能絕對保證查詢性能的提高,有時候分區(qū)會帶來性能上的提高,有時候會降低。
在OLAP系統(tǒng)中,不需要使用綁定(BIND)變量,因為整個系統(tǒng)的執(zhí)行量很小,分析時間對于執(zhí)行時間來說,可以忽略,而且可避免出現(xiàn)錯誤的執(zhí)行計劃。但是OLAP中可以大量使用位圖索引,物化視圖,對于大的事務,盡量尋求速度上的優(yōu)化,沒有必要像OLTP要求快速提交,甚至要刻意減慢執(zhí)行的速度。
綁定變量真正的用途是在OLTP系統(tǒng)中,這個系統(tǒng)通常有這樣的特點,用戶并發(fā)數(shù)很大,用戶的請求十分密集,并且這些請求的SQL 大多數(shù)是可以重復使用的。
OLTP,也叫聯(lián)機事務處理(Online Transaction Processing),表示事務性非常高的系統(tǒng),一般都是高可用的在線系統(tǒng),以小的事務以及小的查詢?yōu)橹鳎u估其系統(tǒng)的時候,一般看其每秒執(zhí)行的Transaction以及Execute SQL的數(shù)量。在這樣的系統(tǒng)中,單個數(shù)據(jù)庫每秒處理的Transaction往往超過幾百個,或者是幾千個,Select 語句的執(zhí)行量每秒幾千甚至幾萬個。典型的OLTP系統(tǒng)有電子商務系統(tǒng)、銀行、證券等,如美國eBay的業(yè)務數(shù)據(jù)庫,就是很典型的OLTP數(shù)據(jù)庫。
列組(Column Group)
OceanBase通過列組支持行列混合存儲,每個列組存儲多個經(jīng)常一起訪問的列。
技術經(jīng)驗分享:漫談OceanBase 列式存儲
如上圖所示,OceanBase SSTable首先按照列組存儲,每個列組內部再按行存儲。分為幾種情況:
·所有列屬于同一個列組。數(shù)據(jù)在SSTable中按行存儲,OLTP應用往往配置為這種方式。
·每列對應一個列組。數(shù)據(jù)在SSTable中按列存儲,這種方式在實際應用中比較少見。
·每個列組對應一行數(shù)據(jù)的部分列。數(shù)據(jù)在SSTable中按行列混合存儲,OLAP應用往往配置為這種方式。
OceanBase還允許一個列屬于多個列組,通過冗余存儲這些列,能夠提高訪問性能。例如,某表格總共包含5列,用戶經(jīng)常一起訪問(1,3,5)或者(1,2,3,4)列。如果將(1,3,5)和(l,2,3,4)存儲到兩個列組中,那么,大部分訪問只需要讀取一個列組,避免了多個列組的合并操作。
列式存儲提高了數(shù)據(jù)壓縮比,然面,實踐過程中我們發(fā)現(xiàn),由于OceanBase最初的幾個版本內存操作實現(xiàn)得不夠精細,例如數(shù)據(jù)結構設計不合理,數(shù)據(jù)在內存中膨脹很多倍,導致大查詢的性能瓶頸集中在CPU,列式存儲的優(yōu)勢完全沒有發(fā)揮出來。這就告訴我們,列式存儲的前提是設計好內存數(shù)據(jù)結構,把CPU操作優(yōu)化好,否則,后續(xù)的工作都是無用功。為了更好地支持OLAP應用,新版的OceanBase將重新設計列式存儲引擎