列存儲的數據庫更適合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行式存儲
關注整張表內容,或者須要常常更新數據 |
須要常常讀取整行數據 |
不須要彙集運算,或者快速查詢需求 |
數據表自己數據行並很少 |
數據表的列自己有太多惟一性的數據 |