行存儲和列存儲

列存儲的數據庫更適合OLAP
行存儲的數據庫更適合OLTPsql

所謂的快只是針對於進行olap操做而言數據庫

咱們知道,數據在存儲中的基本單位爲頁,這也是進行數據讀取時候基本單位,一次讀取就是一次IO操做spa

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

那麼我假設以下的4*4表格爲一個數據頁server

再假設,有這樣一個表格 字段1 字段2
字段1的值爲 col1value1,col1value2.....
字段2的值爲col2value1,col2value2......blog

再假設一個excel的單元格爲一個存儲單位,數據總量佔了2個頁,
那麼以行方式存儲大概就這樣的:索引

以列方式存儲則是這樣的:內存

這時,若是我須要執行以下查詢(oltp典型查詢)
select 字段1,字段2 from table where 字段1='col1value1'
以行方式查詢(在有適當的索引狀況下),那麼,執行一次以上查詢,只須要掃描一次page1就能夠了
以列方式查詢,須要投其掃描page1 和page2共2次,分別取得字段1,字段2的單行值ci

OK,咱們換成olap的典型查詢
select avg(字段2) from table
--(注意,這裏假設字段2爲一個整型數據,並且無where條件限制,即須要掃描所有數據)
對於行存儲,這個查詢須要兩次IO將所有數據放入內存後,進行頁間數據的跳讀(類隨機讀取)
對於列存儲,只須要一次IO將page2放入內存後進行連續讀取,若是字段2還有多頁的話,也都是進行的物理連續讀取table

也就是說,在進行olap操做時候,不只是減少了IO次數,並且把隨機讀取變爲了連續讀取

 

詳細概括爲以下:

選擇列式存儲

基於一列或比較少的列計算的時候

常常關注一張表某幾列而非整表數據的時候

數據表擁有很是多的列的時候

數據表有很是多行數據而且須要彙集運算的時候

數據表列裏有很是多的重複數據,有利於高度壓縮

選擇HANA行式存儲

關注整張表內容,或者須要常常更新數據

須要常常讀取整行數據

不須要彙集運算,或者快速查詢需求

數據表自己數據行並很少

數據表的列自己有太多惟一性的數據

相關文章
相關標籤/搜索