行存儲與列存儲筆記


在了解HANA的同時遇到了列存儲的概念,因此GOOGLE了些資料,作為筆記記錄於此。
 
 
 
一般的數據庫采用行存儲,行存儲的寫入是一次性完成的。由於行存儲的存儲結構是以數據行為單位聚簇在一起的,這樣的實現能夠保證數據的完整性,保證寫入的過程成功或失敗。對於數據寫入,行存儲只需將磁頭移動到相應行的位置即可完成寫入操作;對於數據修改,與寫入相似,行存儲能夠保持較高的效率;對於數據的讀取,行存儲通常將整行的數據讀出,如果僅需要讀取幾列,行存儲會在內存中將冗余列消除,這樣的處理方式對於常規數據量的數據讀取是可以接受的,但對於大數據,過多的冗余必定會造成數據讀取的低效。
 
在1985年SIGMOD會議上就有文章” A decomposition storage model”對列存儲DSM(decomposition storage model)做了比較詳細的介紹,而Sybase更在2004年左右就推出了列存儲的Sybase IQ數據庫系統。列存儲不同於以行作為聚簇的存儲模式,而采用了以列(字段)作為聚簇單元。對於數據寫入與修改,列存儲的效率相對於行存儲的效率較低,主要由於列存儲以列為存儲聚簇的模式導致每次修改或寫入多行數據都需要將磁盤磁頭移動到對應位置;而對於數據讀取,列存儲相對於行存儲則有着獨特的優勢。首先,列存儲可以直接將對應列讀出,不存在冗余列現象;其次,列存儲的每一列數據類型是同質的,不存在二義性問題。比如說某列數據類型為整型(int),那么它的數據集合一定是整型數據。這種情況使數據解析變得十分容易,同時也容易為這種存儲設計更好的壓縮/解壓算法。相比之下,行存儲則要復雜得多,因為在一行記錄中保存了多種類型的數據,數據解析需要在多種數據類型之間頻繁轉換,這個操作很消耗CPU,增加了解析的時間。所以,列存儲的解析過程更有利於分析大數據。
 
為了改進列存儲的缺點,往往采用多硬盤的解決方案,以多線程並行讀寫磁盤,有效減少磁盤讀寫競用;同時加入類似關系數據庫的回滾機制,當某一列發生寫入失敗時,此前寫入的數據全部失效,同時加入散列碼校驗,進一步保證數據完整性。
 
綜上所述,相對於列存儲,行存儲更適合於數據挖掘、大數據等類型的應用,這也是SAP HANA采用列存儲技術的原因之一,利用HANA的內存計算模式與內存並行計算的方式能夠有效提升數據讀寫效率、降低列存儲模式寫入/修改速度較慢的弊端。
 
引用:
1.《大數據存取的選擇:行存儲還是列存儲?》 袁萌 http://www.infoq.com/cn/articles/bigdata-store-choose
2.《說說列存儲技術》http://www.cnblogs.com/happyy/archive/2010/04/26/1721481.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM