傳統的關係型資料庫,如 oracle、db2、mysql、sql server 等採用行式儲存法(row-based),在基於行式儲存的資料庫中, 資料是按照行資料為基礎邏輯儲存單元進行儲存的, 一行中的資料在儲存介質中以連續儲存形式存在。
列儲存(column-based)是相對於行儲存來說的,新興的 hbase、hp vertica、emc greenplum 等分布式資料庫均採用列式儲存。在基於列式儲存的資料庫中, 資料是按照列為基礎邏輯儲存單元進行儲存的,一列中的資料在儲存介質中以連續儲存形式存在。
在資料庫中,資料處理可分為兩類:聯機事務處理oltp(on-line transaction processing)和聯機分析處理olap(on-line analytical processing),oltp是傳統關係型資料庫的主要應用,用來執行一些基本的、日常的事務處理,比如資料庫增、刪、改、查等等,而olap則是分布式資料庫的主要應用,它對實時性要求不高,但處理的資料量大,通常應用於複雜的動態報表系統上。
oltp和olap的主要區別:
行儲存的適用場景:
(1)適合隨機的增、刪、改、查操作;
(2)需要在行中選取所有屬性的查詢操作;
(3)需要頻繁插入或更新的操作,其操作與索引和行的大小更為相關。
列儲存的適用場景:
(1)查詢過程中,可針對各列的運算併發執行,在記憶體中聚合完整記錄集,降低查詢響應時間;
(2)在資料中高效查詢資料,無需維護索引(任何列都能作為索引),查詢過程中能夠儘量減少無關io,避免全表掃瞄;
(3)因為各列獨立儲存,且資料型別已知,可以針對該列的資料型別、資料量大小等因素動態選擇壓縮演算法,以提高物理儲存利用率;如果某一行的某一列沒有資料,在列儲存時,就可以不儲存該列的值,這將比行式儲存更節省空間。
在實際應用中我們會發現,行式資料庫在讀取資料時存在乙個固有的缺陷,比如,所選擇查詢的目標即是只涉及少數幾個字段,但由於這些目標資料埋藏在各行資料單元中,而行單元往往又特別大,應用程式必須讀取每一條完整的行記錄,從而使得讀取效率大大較低,對此,行式資料庫給出的優化方案是加索引,在oltp型別的應用中,通過索引機制或給表分割槽等手段可以簡化查詢操作步驟,並提公升查詢效率。
但針對海量資料背景的olap應用(例如分布式資料庫、資料倉儲等),行儲存的資料庫就有些力不從心了,行式資料庫建立索引和物化檢視需要花費大量時間和資源,因此還是不划算的,無法從根本上解決查詢效能和維護成本的問題,也不適用於資料倉儲等應用場景,所以後來出現了基於列式儲存的資料庫。
對於資料倉儲和分布式資料庫來說,大部分情況下它會從各個資料來源彙總資料,然後進行分析和反饋,其大多數操作是圍繞同乙個字段(屬性)進行的,而當查詢某屬性的資料記錄時,列式資料庫只需返回與列屬性相關的值。在大資料量查詢場景中,列式資料庫可在記憶體中高效組裝各列的值,最終形成關係記錄集,因此可以顯著減少io消耗並降低查詢響應時間,非常適合資料倉儲和分布式的應用。
HANA資料庫的行儲存和列儲存
column based androw based storage in the sap hana database hana資料庫同時支援行儲存和列儲存。列儲存讀效能好,擁有較高的壓縮比,一些特性如分割槽只適用於列儲存。常用於批量更新的大資料量表。行儲存更新插入效能好,常用於經常單獨操作的小資料量...
行儲存和列儲存的區別
列儲存不同於傳統的關係型資料庫,其資料在表中是按行儲存的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。按列儲存每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量,乙個欄位的資料聚集儲存,那就更容易為這種聚集儲存設計更...
行儲存和列儲存的區別
一 對比行儲存和列儲存的區別前,我們先來聊下背景。假設我們用mysql做了乙個商品訂單庫order,如下 orderid name kind price kgtime1豬肉 肉類50 2.02020.01.012牛肉 肉類60 1.02020.01.013白菜 蔬菜61.02020.01.01 二 ...