行式資料庫與列式資料庫
開發用了很久的Vertica,知道它是“列式資料庫”但一直沒有去研究過列式資料庫的一些特性,現在來總結一下。
列式資料庫是以列相關儲存架構進行資料儲存的資料庫,主要適合於批量資料處理和即時查詢。相對應的是行式資料庫,資料以行相關的儲存體系架構進行空間分配,主要適合於小批量的資料處理,常用於聯機事務型資料處理。
資料庫以行、列的二維表的形式儲存資料,但是卻以一維字串的方式儲存,例如以下的一個表:
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;
由於設計上的不同,列式資料庫在並行查詢處理和壓縮上更有優勢。而且資料是以列為單元儲存,完全不用考慮資料建模或者說建模更簡單了。要查詢計算哪些列上的資料,直接讀取列就行了。不像行式資料庫,一行上有多列,儘管我們只需要分析某些列的資料,也要讀取表上的全部資料(FTS為例)。比如說這句sql:"select a, b from table limit 100", 列式資料庫只需要讀取a,b這兩列前100行到記憶體中,而行式資料庫則需要將前100行資料都讀入記憶體中。顯而易見,列式資料庫的IO更高效。
列存資料庫是用來支援一部分資料倉庫或集市的應用的。傳統資料庫做統計分析時的最大瓶頸就是在IO資料。所以列存的主要應用場景就是在99%的操作都是查詢的應用,所有資料庫更新的操作都是計劃內的而不是隨機的。列存的單條記錄的增刪改操作效能一般,甚至比行存資料庫會差不少,但彙總查詢超快。適合標準的星形模型結構,多維查詢。
傳統的行式資料庫,是按照行儲存的,維護大量的索引和物化檢視無論是在時間(處理)還是空間(儲存)方面成本都很高。而列式資料庫恰恰相反,列式資料庫的資料是按照列儲存,每一列單獨存放,資料即是索引。只訪問查詢涉及的列,大大降低了系統I/O,每一列由一個線來處理,而且由於資料型別一致,資料特徵相似,極大方便壓縮。
行式資料庫擅長隨機讀操作,列式資料庫則更擅長大批量資料量查詢
列式資料庫優缺點
列式資料庫從一開始就是面向大資料環境下資料倉庫的資料分析而產生,它跟行式資料庫相比當然也有一些前提條件和優缺點.
列式資料庫優點:
極高的裝載速度 (最高可以等於所有硬碟IO 的總和,基本是極限了)
適合大量的資料而不是小資料
實時載入資料僅限於增加(刪除和更新需要解壓縮Block 然後計算然後重新壓縮儲存)
高效的壓縮率,不僅節省儲存空間也節省計算記憶體和CPU.
非常適合做聚合操作.
缺點:
不適合掃描小量資料
不適合隨機的更新
批量更新情況各異,有的優化的比較好的列式資料庫(比如Vertica)表現比較好,有些沒有針對更新的資料庫表現比較差.
不適合做含有刪除和更新的實時操作.
下面簡單羅列了一些選擇行資料庫還是列資料庫的權衡依據。當然,如果能夠把資料全放在記憶體中,那麼使用記憶體資料庫效能會更好。
- 在只需要根據某幾列來聚合資料的時候按列的資料組織方式更有效。因為這樣只需要讀取一部分資料,要比讀取全部資料更快.
- 當只需要修改某一列值的時候按列的資料組織方式更有效。因為可以直接找到某列資料並修改,而與行中的其他列無關。
- 當需要某行的多列資料的時候按行的資料組織方式更有效。當行中資料不是太多的情況下一次硬碟定址就可以獲得該行的所有資料。
- 在新增行資料的時候,如果各列都有值,那麼按行的資料組織方式會更有效,因為只需要一次硬碟定址就可以寫入整行的全部資料.
在實際應用中,面向行的資料儲存架構更適用於OLTP-頻繁互動事務的場景。面向列的資料儲存架構更適用於OLAP-(如資料倉庫)這樣在海量資料((可能達到 terabyte規模))中進行有限複雜查詢的場景。
Vertica的底層儲存實現和HBase的不一樣。雖然都是叫按列儲存,HBase是先將表格按行劃分成塊,在資料塊內部才是按列儲存;Vertica的儲存比較靈活,它號稱可以配置哪些列要放在一起儲存,每列都分開就是最基本的按列儲存,所有列都和在一起就是按行儲存了,不過同一列的資料還是會放在一起。HBase,Cassandra本身只有儲存能力,如果要做查詢需要藉助Hadoop這樣的框架進行,Hive就是把查詢都編譯成Hadoop任務實現的。Hadoop的查詢效率要比關係型資料庫要低,主要是因為1)Hadoop為了保證容錯,中間資料都要走一遍磁碟,IO開銷大;2)Hadoop缺少查詢優化引擎還有索引等優化機制。Vertica分析平臺關鍵特性
- 實時查詢 & 載入 »通過不斷載入的資訊,獲取資料的時間價值,同時允許立即進行豐富的分析。
- 高階的庫內分析 »不斷增長的特點和功能庫,展示和處理更多和CPU核心緊密結合的資料,而無需解壓。
- 資料設計 & 管理工具 »強大的設定,調整和控制以達到使用最小的管理工作,就可以進行持續改進,而系統仍然保持線上。
- 列式儲存 & 執行 »執行查詢快50 - 1000倍,消除了昂貴的磁碟I / O,沒有的索引和物化檢視的麻煩和開銷。
- 強勁的資料壓縮 »我們的引擎,以較少的資本性支出完成更多的壓縮資料,同時提供卓越的效能。
- 可擴充套件的MPP架構 »Vertica的自動和無限線性擴充套件,只需在網格中新增行業標準x86伺服器 . . .
- 自動的高可用性 »不間斷地執行與優化,提供卓越的查詢效能,良好的自動冗餘,故障切換和恢復。. . . .
- 優化器 執行引擎 & 負載管理 »獲得最大的效能,而無需擔心它如何工作的細節。使用者只思考有關的問題,我們快速地提供答案。