lieshi

列式存儲數據庫(Column-Oriented DBMS)是一套以數據列而非數據行的方式存儲數據表的數據

庫管理系統。相比之下,大多數關係型數據庫都把數據存儲於行中,故得名。列式存儲數據庫在

數據倉庫系統,CRM系統,以及其它即席查詢(AD HOC Query)系統這樣對同類數據有大量聚合

運算的系統中適用。

關係型數據庫系統以二維表的形式提供數據,二維即行列。如下示例:

這張簡單的表中包含了一個員工標識符(EmpId),姓名列(Lastname, Firstname)和薪水

(Salary)。其實這樣的二維表只在理論上(邏輯上)存在,實際情況中,硬件存儲設備要求數

據以序列化的方式存在,亦即:
001:10,Smith,Joe,40000;002:12,Jones,Mary,50000;003:11,Johnson,Cathy,44000;004:22,Jon

es,Bob,55000;

001,002...是rowid。當數據插入表時會被賦予一個rowid, 用於系統內部引用數據。(這裏以

三位整數舉例,實際上系統會適用64位數或128位數作爲rowid)


我們經常需要獲取系統中某個對象信息的操作,比如獲取一個通訊錄系統中某個聯繫人的聯繫方

式,或者獲取一個網購系統中某產品的信息。行式數據庫被設計爲可用最少的操作返回整行數據

,與該種操作正相匹配。

但行式數據庫處理對整個數據集的操作時效率不高。比如爲獲取薪水在40000到50000區間的員工

記錄,行式數據庫必須遍歷整個數據集。當然,上例中所有數據都符合條件,遍歷得到的數據都

是滿足條件的;但只要數據量稍微一多,甚至只要幾百條,就會有很多無效遍歷,造成很多磁盤

操作。

爲提高此類操作的效率,大多數數據庫系統採用了索引。索引將某一列(或多列)的所有值與相

應的一個指向rowid的指針存儲在一起。於是Salary列的索引就是這樣:
001:40000;002:50000;003:44000;004:55000;

因爲索引只存儲一列值,而非所有列的值,索引的大小會明顯小於原表。而且索引一般都會事先

排序,於是在索引這個較小的數據集中遍歷數據,減少了磁盤的操作。索引會對效率起到很大幫

助,但維護索引對系統來說又是一項負擔,尤其是在新數據寫入數據庫時,索引也必須更新。

有些行式數據庫把所有數據存在內存中。這樣的系統沒有磁盤操作,對數據集怎麼訪問的效率都

差不多,於是可以省略索引。這樣的數據庫系統很精簡,但容量受到內存限制。

行式數據庫原理
硬盤最耗時的操作是尋址。爲提高整體效率,相關的數據應該規律存放以減少尋址次數,這就是

所謂的就近訪問原則(Locality of Reference, or Principle of Locality)。硬盤由一系列

固定大小的塊(block)組成,一般一個數據塊可以存儲多行數據。通過整理我們讓一個數據塊

只存儲一行數據,同時把相關的數據塊放在一起,以減少系統對塊的尋址以及讀取。

而列式數據庫以列的方式將數據序列化,先存一個列,然後存下一個列,就像這樣:
10:001,12:002,11:003,22:004;Smith:001,Jones:002,Johnson:003,Jones:004;Joe:001,Mary:0

02,Cathy:003,Bob:004;40000:001,50000:002,44000:003,55000:004;

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