列式儲存資料庫

Ready!發表於2015-04-20

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

RowIdEmpIdLastnameFirstnameSalary
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

 

相關文章