列存储的数据库更适合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行式存储
关注整张表内容,或者须要常常更新数据 |
须要常常读取整行数据 |
不须要汇集运算,或者快速查询需求 |
数据表自己数据行并很少 |
数据表的列自己有太多惟一性的数据 |