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