1/什么是行存储和列存储?
<1>传统的关系型数据库,如Oracle、DB2、MySQL、SQL SERVER等采用行式存储法(Row-based,基于行)
在基于行式存储的数据库中,数据是按照行数据为基础逻辑存储单元进行存储的,
一行中的数据在存储介质中以连续存储形式存在。
<2>列存储(Column-based,基于列)是相对于行存储来说的,
新兴的Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。
在基于列式存储的数据库中,数据是按照列为基础逻辑存储单元进行存储的,
一列中的数据在存储介质中以连续存储形式存在。
2/OLTP和OLAP
在数据库中,数据处理可分为两大类:
<1>联机事务处理OLTP(on-line transaction processing)
OL: on-line
T:transaction
P:processing
OLTP是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,
比如数据库增、删、改、查等等
<2>联机分析处理OLAP(On-Line Analytical Processing)
OL: on-line
A:analytical
P:processing
OLAP则是分布式数据库的主要应用,它对实时性要求不高,但处理的数据量大,
通常应用于复杂的动态报表系统上。

3/行存储的适用场景
(1)适合随机的增、删、改、查操作;
(2)需要在行中选取所有属性的查询操作;
(3)需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。
4/列存储的适用场景
(1)查询过程中,可针对各列的运算并发执行,在内存中聚合完整记录集,降低查询响应时间;
(2)在数据中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;
(3)因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。
5/行式存储的缺点
<1>
实际应用中我们会发现,行式数据库在读取数据时存在一个固有的缺陷,
比如,有的时候我们所查询的数据只是几个字段而已,
但由于这些目标数据埋藏在各行数据单元中,而行单元往往又特别大,
应用程序必须读取每一行完整的行记录,从而使得读取效率大大较低,
对此,行式数据库给出的优化方案是加索引。
在OLTP类型的应用中,通过索引机制或给表分区等手段可以简化查询操作步骤,并提升查询效率。
<2>
针对海量数据背景的OLAP应用(例如分布式数据库、数据仓库等),
行存储的数据库就有些力不从心了,行式数据库建立索引和物化视图需要花费大量时间和资源,
因此还是不划算的,无法从根本上解决查询性能和维护成本的问题,也不适用于数据仓库等应用场景0,
所以后来出现了基于列式存储的数据库。
<3>
对于数据仓库和分布式数据库来说,大部分情况下它会从各个数据源汇总数据,然后进行分析和反馈,
其大多数操作是围绕同一个字段(属性)进行的,而当查询某属性的数据记录时,列式数据库只需返回与列属性相关的值。
在大数据量查询场景中,列式数据库可在内存中高效组装各列的值,最终形成关系记录集,
因此可以显著减少IO消耗并降低查询响应时间,非常适合数据仓库和分布式的应用。