行式資料庫與列式資料庫的對比
導語:隨著大資料的發展,現在出現的列式儲存和列式資料庫。它與傳統的行式資料庫有很大區別的。
正文:
行式資料庫是按照行儲存的,行式資料庫擅長隨機讀操作不適合用於大資料。像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,例如對海量資料的查詢。