數(shù)據(jù)庫為什么會分為“行式存儲”和“列式存儲”呢?
我們知道
當今的數(shù)據(jù)處理大致可分為兩大類
聯(lián)機事務處理 OLTP
(on-line transaction processing)
以及聯(lián)機分析處理 OLAP
(On-Line Analytical Processing)
OLTP 是傳統(tǒng)關系型數(shù)據(jù)庫的主要應用
用來執(zhí)行一些基本的、日常的事務處理
比如數(shù)據(jù)庫記錄的增、刪、改、查等等
而 OLAP 則是分布式數(shù)據(jù)庫的主要應用
它對實時性要求不高,但處理的數(shù)據(jù)量大
通常應用于復雜的動態(tài)報表系統(tǒng)上
OLTP與OLAP的主要區(qū)別
OLTP與OLAP
在數(shù)據(jù)庫的應用類別方面
為何會出現(xiàn)顯著差別呢?
其實,這是因數(shù)據(jù)庫存儲模式不同而造成的
行式存儲和列式存儲
傳統(tǒng)的關系型數(shù)據(jù)庫,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存儲法(Row-based),在基于行式存儲的數(shù)據(jù)庫中, 數(shù)據(jù)是按照行數(shù)據(jù)為基礎邏輯存儲單元進行存儲的, 一行中的數(shù)據(jù)在存儲介質(zhì)中以連續(xù)存儲形式存在。
列式存儲(Column-based)是相對于行式存儲來說的,新興的 Hbase、HP Vertica、EMC Greenplum 等分布式數(shù)據(jù)庫均采用列式存儲。在基于列式存儲的數(shù)據(jù)庫中, 數(shù)據(jù)是按照列為基礎邏輯存儲單元進行存儲的,一列中的數(shù)據(jù)在存儲介質(zhì)中以連續(xù)存儲形式存在。
行式存儲的適用場景包括:
1、適合隨機的增刪改查操作;
2、需要在行中選取所有屬性的查詢操作;
3、需要頻繁插入或更新的操作,其操作與索引和行的大小更為相關。
實操中我們會發(fā)現(xiàn)
行式數(shù)據(jù)庫在讀取數(shù)據(jù)的時候
會存在一個固有的“缺陷”
比如,所選擇查詢的目標即使只涉及少數(shù)幾項屬性
但由于這些目標數(shù)據(jù)埋藏在各行數(shù)據(jù)單元中
而行單元往往又特別大
應用程序必須讀取每一條完整的行記錄
從而使得讀取效率大大降低
對此,行式數(shù)據(jù)庫給出的優(yōu)化方案是加“索引”
在OLTP類型的應用中
通過索引機制或給表分區(qū)等手段
可以簡化查詢操作步驟,并提升查詢效率
但針對海量數(shù)據(jù)背景的OLAP應用
(例如分布式數(shù)據(jù)庫、數(shù)據(jù)倉庫等等)
行式存儲的數(shù)據(jù)庫就有些“力不從心”了
行式數(shù)據(jù)庫建立索引和物化視圖
需要花費大量時間和資源
因此還是得不償失
無法從根本上解決查詢性能和維護成本等問題
也不適用于數(shù)據(jù)倉庫等應用場景
所以后來出現(xiàn)了基于列式存儲的數(shù)據(jù)庫
對于數(shù)據(jù)倉庫和分布式數(shù)據(jù)庫來說
大部分情況下它會從各個數(shù)據(jù)源匯總數(shù)據(jù)
然后進行分析和反饋
其操作大多是圍繞同一列屬性的數(shù)據(jù)進行的
而當查詢某屬性的數(shù)據(jù)記錄時
列式數(shù)據(jù)庫只需返回與列屬性相關的值
在大數(shù)據(jù)量查詢場景中
列式數(shù)據(jù)庫可在內(nèi)存中高效組裝各列的值
最終形成關系記錄集
因此可以顯著減少IO消耗
并降低查詢響應時間
非常適合數(shù)據(jù)倉庫和分布式的應用

列式存儲引擎的適用場景包括:1、查詢過程中,可針對各列的運算并發(fā)執(zhí)行(SMP),***在內(nèi)存中聚合完整記錄集,***可能降低查詢響應時間;
2、可在數(shù)據(jù)列中高效查找數(shù)據(jù),無需維護索引(任何列都能作為索引),查詢過程中能夠盡量減少無關IO,避免全表掃描;
3、因為各列獨立存儲,且數(shù)據(jù)類型已知,可以針對該列的數(shù)據(jù)類型、數(shù)據(jù)量大小等因素動態(tài)選擇壓縮算法,以提高物理存儲利用率;如果某一行的某一列沒有數(shù)據(jù),那在列存儲時,就可以不存儲該列的值,這將比行式存儲更節(jié)省空間。
當然,跟行數(shù)據(jù)庫一樣
列式存儲也有不太適用的場景
主要包括:
數(shù)據(jù)需要頻繁更新的交易場景
表中列屬性較少的小量數(shù)據(jù)庫場景
不適合做含有刪除和更新的實時操作
隨著列式數(shù)據(jù)庫的發(fā)展,傳統(tǒng)的行式數(shù)據(jù)庫加入了列式存儲的支持,形成具有兩種存儲方式的數(shù)據(jù)庫系統(tǒng)。例如,隨著Oracle 12c推出了in memory組件,使得Oracle數(shù)據(jù)庫具有了雙模式數(shù)據(jù)存放方式,從而能夠?qū)崿F(xiàn)對混合類型應用的支持,當然列式數(shù)據(jù)庫也有對行式存儲的支持比如HP Vertica??傊?,沒有***的數(shù)據(jù)庫,一切都要以實際的數(shù)據(jù)存儲和分析需求為準!