1. 程式人生 > >為什麼列儲存資料庫讀取速度會比傳統的行資料庫快?

為什麼列儲存資料庫讀取速度會比傳統的行資料庫快?

如果懶得看分析直接看結論:
列儲存的資料庫更適合OLAP
行儲存的資料庫更適合OLTP

所謂的快只是針對於進行olap操作而言

我們知道,資料在儲存中的基本單位為頁,這也是進行資料讀取時候基本單位,一次讀取就是一次IO操作

以sql server為例,一個數據頁大小為8K,資料頁中儲存的是資料,資料是連續儲存的

那麼我假設如下的4*4表格為一個數據頁


再假設,有這樣一個表格 欄位1 欄位2
欄位1的值為 col1value1,col1value2.....
欄位2的值為col2value1,col2value2......

再假設一個excel的單元格為一個儲存單位,資料總量佔了2個頁,
那麼以行方式儲存大概就這樣的



以列方式儲存則是這樣的

這時,如果我需要執行如下查詢(oltp典型查詢)
select 欄位1,欄位2 from table where 欄位1='col1value1'
以行方式查詢(在有適當的索引情況下),那麼,執行一次以上查詢,只需要掃描一次page1就可以了
以列方式查詢,需要投其掃描page1 和page2共2次,分別取得欄位1,欄位2的單行值

OK,我們換成olap的典型查詢
select avg(欄位2) from table
--(注意,這裡假設欄位2為一個整型資料,而且無where條件限制,即需要掃描全部資料)
對於行儲存,這個查詢需要兩次IO將全部資料放入記憶體後,進行頁間資料的跳讀(類隨機讀取)
對於列儲存,只需要一次IO將page2放入記憶體後進行連續讀取,如果欄位2還有多頁的話,也都是進行的物理連續讀取

也就是說,在進行olap操作時候,不僅是減小了IO次數,而且把隨機讀取變為了連續讀取
以下為網上隨便找的一張SSD效能測試圖,注意seq(連續)和4k(隨機)之間的效能區別


以上