導語:隨着大數據的發展,現在出現的列式存儲和列式數據庫。它與傳統的行式數據庫有很大區別的。
正文:
行式數據庫是按照行存儲的,行式數據庫擅長隨機讀操作不適合用於大數據。像SQL server,Oracle,mysql等傳統的是屬於行式數據庫范疇。
列式數據庫從一開始就是面向大數據環境下數據倉庫的數據分析而產生。
數據庫以行、列的二維表的形式存儲數據,但是卻以一維字符串的方式存儲,例如以下的一個表:
|
EmpId
|
Lastname
|
Firstname
|
Salary
|
|
1
|
Smith
|
Joe
|
40000
|
|
2
|
Jones
|
Mary
|
50000
|
|
3
|
Johnson
|
Cathy
|
44000
|
這個簡單的表包括員工代碼(EmpId), 姓名字段(Lastname and Firstname)及工資(Salary).
這個表存儲在電腦的內存(RAM)和存儲(硬盤)中。雖然內存和硬盤在機制上不同,電腦的操作系統是以同樣的方式存儲的。數據庫必須把這個二維表存儲在一系列一維的“字節”中,由操作系統寫到內存或硬盤中。
行式數據庫把一行中的數據值串在一起存儲起來,然后再存儲下一行的數據,以此類推。
1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;
列式數據庫把一列中的數據值串在一起存儲起來,然后再存儲下一列的數據,以此類推。
1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000; 這是一個簡化的說法。
列式數據庫的代表包括:Sybase IQ,infobright、infiniDB、GBase 8a,ParAccel, Sand/DNA Analytics和 Vertica。
MPP的列存儲數據倉庫包括:Yonghong Z-DataMart。
---------------------------------------------------
---------------------------------------------------
通常行式數據庫的給出的優化方案是加“索引”,給表分區等等之類的.
列式數據庫的優缺點:
優點:
-
極高的裝載速度 (最高可以等於所有硬盤IO 的總和,基本是極限了)
-
適合大量的數據而不是小數據
-
實時加載數據僅限於增加(刪除和更新需要解壓縮Block 然后計算然后重新壓縮儲存)
-
高效的壓縮率,不僅節省儲存空間也節省計算內存和CPU。
-
非常適合做聚合操作。
缺點:
-
不適合掃描小量數據
-
不適合隨機的更新
-
批量更新情況各異,有的優化的比較好的列式數據庫(比如Vertica)表現比較好,有些沒有針對更新的數據庫表現比較差。
-
不適合做含有刪除和更新的實時操作。
補充列式數據庫的壓縮:
剛才其實跳過了資料里提到的另一種技術:通過字典表壓縮數據。為了方面后面的講解,這部分也順帶提一下了。
下面中才是那張表本來的樣子。經過字典表進行數據壓縮后,表中的字符串才都變成數字了。正因為每個字符串在字典表里只出現一次了,所以達到了壓縮的目的(有點像規范化和非規范化Normalize和Denomalize)

列式數據庫由於其特殊的執行引擎,在數據中間過程運算的時候一般不需要解壓數據而是以指針代替運算,直到最后需要輸出完整的數據時。
行式數據庫主要適合於在線交易性的OLTP應用,而列式數據庫主要適合於海量靜態數據的分析,一般應用於OLAP。但只是依靠OLTP還是OLAP來區分是采用行式數據庫還是列式數據庫,在很多時候還不是很明確,特別很多時候有些應用很難說是OLTP還是OLAP,例如對海量數據的查詢。
