列式存儲數據庫


關系型數據庫系統以二維表的形式呈現數據,比如下面的員工表

RowId EmpId Lastname Firstname Salary
001 10 Smith Joe 40000
002 12 Jones Mary 50000
003 11 Johnson Cathy 44000
004 22 Jones Bob 55000

上面的格式僅僅存在於理論和邏輯中,事實上存儲設備要求數據序列化為某種形式。

我們知道對於硬盤來說,最昂貴的操作是查找。為了提高最終性能,所需要的相關數據應該以某種方式去存儲從而使“查找”操作盡可能少。硬盤由一系列規定大小的塊(block)組成, 通常足以容納數據表的幾行。通過把相關的行存儲在塊中,僅僅一定數量的塊需要被讀取從而最小化了查找的數量。

 

 

行式存儲

傳統的存儲方案是按行序列化數據,如下所示

001:10,Smith,Joe,40000;002:12,Jones,Mary,50000;003:11,Johnson,Cathy,44000;004:22,Jones,Bob,55000;

行式存儲系統被設計為以很少的操作就可以返回整行或整條記錄。當我們需要獲取關於某個特定對象的信息的時候,比如某個用戶的聯系信息或某件商品信息,這種設計就相當適用。

但是行式存儲不適用於對整個數據集的操作。比如,找出工資在40000到50000之間的記錄,行式存儲系統可能得找遍這個數據集才能找出匹配的所有記錄。當數據量相當大時,這些記錄存儲於分散的不同的磁盤塊中,這樣相當多的磁盤操作就變得不可避免了。

為了提高這種類型操作的性能,大多數DBMS數據庫系統使用索引技術。它把列的值存儲在一起,同時與記錄ID關聯。如下所示

001:40000;002:50000;003:44000;004:55000;

我們可以看到,這里僅僅存儲整個數據集的一部分,一般來說索引比整個主表要小很多。掃描小的數據集所需要的磁盤操作當然減少了。然而,當有新的數據寫入數據庫時,索引需要維護,這個對系統增加了額外的開銷。

 

有些行式存儲數據庫被設計為完全運行於內存中,及內存數據庫。這樣的系統不依賴於磁盤操作,對於整個數據庫的任何數據訪問具有同等時間. (equal-time access) 這樣的系統可能會很簡單有效,然而它們管理的數據僅限於存儲在內存中。

 

 

列式存儲

列式存儲系統將某一列的所有值序列化在一起,然后是另一列的所有值。對於我們的例表,數據存儲結構如下

10:001,12:002,11:003,22:004;Smith:001,Jones:002,Johnson:003,Jones:004;Joe:001,Mary:002,Cathy:003,Bob:004;40000:001,
50000:002,44000:003,55000:004;

這樣的結構看起來與行式存儲中的索引結構看起來很像,對吧。是的,沒錯,看起來很接近。

 

只是,它們之間有顯著的區別。行式存儲中,主鍵是rowid(它關聯到索引數據);列式存儲中,主鍵是數據本身(關聯回rowid),即“數據即索引”。對於常見的查詢,如“所有名字叫Jones的人”,僅僅需要一個操作答案將被找到;另外,像一些聚合運算,基於這樣的存儲結構其性能能得以大幅提高。

 

Refer to: http://en.wikipedia.org/wiki/Column-oriented_DBMS

 


免責聲明!

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



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