列式數據庫

列式數據庫介紹

列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合與批量數據處理和即席查詢。相對應的是行式數據庫,數據以行相關的存儲體系架構進行空間分配,主要適合與小批量的數據處理,常用於聯機事務型數據處理。

列式數據庫以行、列的二維表的形式存儲數據,但是卻以一維字符串的方式存儲,例如以下的一個表:

EmpIdLastnameFirstnameSalary
1SmithJoe40000
2JonesMary50000
3JohnsonCathy44000

這個簡單的表包括員工代碼(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,ParAccel, Sand/DNA Analytics和 Vertica。

 

列式數據庫與行式數據庫

傳統的行式數據庫,是按照行存儲的,維護大量的索引和物化視圖無論是在時間(處理)還是空間(存儲)方面成本都很高。而列式數據庫恰恰相反,列式數據庫的數據是按照列存儲,每一列單獨存放,數據即是索引。只訪問查詢涉及的列,大大降低了系統I/O,每一列由一個線來處理,而且由於數據類型一致,數據特徵相似,極大方便壓縮。

最後盧東明很務實的指出,沒有萬能的數據庫,Sybase IQ也並非萬能,只不過給DBA們的工具箱裏提供更多的選擇,DBA需根據自己的應用場景自行選擇。

在數據倉庫領域,列式數據庫和傳統的行式數據庫有何差別呢?列式數據庫和行式數據庫的擁護者均認爲結合這兩種技術的混合數據庫是個不錯的想法。

行式數據庫擅長隨機讀操作,列式數據庫則更擅長大批量數據量查詢,而混合數據庫則試圖同時包含這兩種技術的優點,在災難恢復環境中,數據要麼按列式存儲,要麼按行式存儲。

未來將是列式數據庫的天下,行數據庫和混合型數據庫都將漸漸消亡,原因如下:數據增長速度很快,對存儲設備(主內存和SSD)的需求也將不斷上升,隨着主內存和SSD中壓縮列所佔百分比的提高,列式數據庫隨機讀的弱點反而變成了優點,這樣列式數據庫不管是應付聯機事務處理,還是大批量更新或大型報表需要執行的複雜查詢都能應付自如。對於更新操作而言,列式數據庫和行式數據庫在這方面已經沒有多大差距了,因爲大部分更新操作只會影響到一行中的一到三列(字段),同時,大部分更新操作影響的是最近的數據,因此主內存/SSD緩存中數據會越來越多。對於插入和刪除操作而言,先在內存中快速更新索引,然後再寫入磁盤,這意味着在I/O密集型情況下也不會有明顯的性能下降。對在線備份而言,按列存儲方法壓縮數據後備份時間窗口將會更短。

 

對今天的數據倉庫而言,列式數據庫的性能和傳統行數據庫相比,根本不在一個數量級上,列式數據庫已經得到了廣泛的認可和使用(Sybase IQ已經有十年曆史,也出現了一些新興列式數據庫公司,如Vertica),數據庫巨人Oracle也按捺不住,在其Exadata數據庫機中也加入了按列存儲選擇,IBM則提供了一個列式專用設備,它可以確定什麼數據該按列存儲,什麼數據該按行存儲,然後將事務分流到相應的設備。

 

列式數據庫優缺點

列式數據庫從一開始就是面向大數據環境下數據倉庫的數據分析而產生,它跟行式數據庫相比當然也有一些前提條件和優缺點.

列式數據庫優點:

極高的裝載速度 (最高可以等於所有硬盤IO 的總和,基本是極限了)

適合大量的數據而不是小數據

實時加載數據僅限於增加(刪除和更新需要解壓縮Block 然後計算然後重新壓縮儲存)

高效的壓縮率,不僅節省儲存空間也節省計算內存和CPU.

非常適合做聚合操作.

 

 

缺點:

不適合掃描小量數據

不適合隨機的更新

批量更新情況各異,有的優化的比較好的列式數據庫(比如Vertica)表現比較好,有些沒有針對更新的數據庫表現比較差.

不適合做含有刪除和更新的實時操作.

 

 

常見誤區

一個常見的誤區認爲如果每次掃描較多行或者全列全表掃描的時候,行式數據庫比列式數據庫更有優勢. 事實上這只是行式數據庫認識上的一個誤區,即認爲列式數據庫的主要優勢在於其列分開儲存,而忽略了列式數據庫上面提到的其他幾大特徵,這個纔是列式數據庫高性能的核心.

 

網友的測試

昨天裝了下兩個基於MySQL的數據倉庫,infindb和infobright,看了文檔發現它們都是列式數據庫,把40多M的數據導入infobright,沒想到數據文件只有1M多,壓縮比令我驚訝!
然後測試了下選擇某一列,在列上做計算,都比MyISAM和InnoDB要快,看了一些原理文檔,就自己模擬了一下,寫了個程序測試。
從內存中讀取效率很高,但是從磁盤中讀取(假設行式數據庫的索引在內存中)比行式數據庫要慢(開始在Twitter上說比行式快是程序寫錯了),不過我覺得還是我設計上的問題,至少Infobright就比MyISAM/InnoDB快,列式應該也有其特殊的索引機制和緩存機制,例如每列分開存在不同的文件,這樣文件指針轉移會更快。
2010-02-04補充:採用了多個文件指針後,列式存儲明顯加速,如果給每個列一個文件指針,效率會非常高,也可以肯定,如果每個列單獨存儲一個文件,效率還會提高。現在文件中列式表讀取效率降低了4/5,接近行式表了。繼續優化還能提高。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章