[转]行式数据库与列式数据库

周攀 17/08/02 09:16:32

开发用了很久的Vertica,知道它是“列式数据库”但一直没有去研究过列式数据库的一些特性,现在来总结一下。

列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理。

数据库以行、列的二维表的形式存储数据,但是却以一维字符串的方式存储,例如以下的一个表:

EmpId Lastname Firstname Salary
1 Smith Joe 40000
2 Jones Mary 50000
3 Johnson Cathy 44000

这个简单的表包括员工代码(EmpId), 姓名字段(Lastname and Firstname)及工资(Salary).

这个表存储在电脑的内存(RAM)和存储(硬盘)中。虽然内存和硬盘在机制上不同,电脑的操作系统是以同样的方式存储的。数据库必须把这个二维表存储在一系列一维的“字节”中,由操作系统写到内存或硬盘中。

行式数据库把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推。

      1,Smith,Joe,40000;
      2,Jones,Mary,50000;
      3,Johnson,Cathy,44000;

列式数据库把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推。

      1,2,3;
      Smith,Jones,Johnson;
      Joe,Mary,Cathy;
      40000,50000,44000;

  由于设计上的不同,列式数据库在并行查询处理和压缩上更有优势。而且数据是以列为单元存储,完全不用考虑数据建模或者说建模更简单了。要查询计算哪些列上的数据,直接读取列就行了。不像行式数据库,一行上有多列,尽管我们只需要分析某些列的数据,也要读取表上的全部数据(FTS为例)。比如说这句sql:”select a, b from table limit 100”, 列式数据库只需要读取a,b这两列前100行到内存中,而行式数据库则需要将前100行数据都读入内存中。显而易见,列式数据库的IO更高效。


  列存数据库是用来支持一部分数据仓库或集市的应用的。传统数据库做统计分析时的最大瓶颈就是在IO数据。所以列存的主要应用场景就是在99%的操作都是查询的应用,所有数据库更新的操作都是计划内的而不是随机的。列存的单条记录的增删改操作性能一般,甚至比行存数据库会差不少,但汇总查询超快。适合标准的星形模型结构,多维查询。

 

传统的行式数据库,是按照行存储的,维护大量的索引和物化视图无论是在时间(处理)还是空间(存储)方面成本都很高。而列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据即是索引。只访问查询涉及的列,大大降低了系统I/O,每一列由一个线来处理,而且由于数据类型一致,数据特征相似,极大方便压缩。

 

行式数据库擅长随机读操作,列式数据库则更擅长大批量数据量查询

 

列式数据库优缺点

列式数据库从一开始就是面向大数据环境下数据仓库的数据分析而产生,它跟行式数据库相比当然也有一些前提条件和优缺点.

列式数据库优点:

极高的装载速度 (最高可以等于所有硬盘IO 的总和,基本是极限了)

适合大量的数据而不是小数据

实时加载数据仅限于增加(删除和更新需要解压缩Block 然后计算然后重新压缩储存)

高效的压缩率,不仅节省储存空间也节省计算内存和CPU.

非常适合做聚合操作.


缺点:

不适合扫描小量数据

不适合随机的更新

批量更新情况各异,有的优化的比较好的列式数据库(比如Vertica)表现比较好,有些没有针对更新的数据库表现比较差.

不适合做含有删除和更新的实时操作.

 

下面简单罗列了一些选择行数据库还是列数据库的权衡依据。当然,如果能够把数据全放在内存中,那么使用内存数据库性能会更好。

  1. 在只需要根据某几列来聚合数据的时候按列的数据组织方式更有效。因为这样只需要读取一部分数据,要比读取全部数据更快.
  2. 当只需要修改某一列值的时候按列的数据组织方式更有效。因为可以直接找到某列数据并修改,而与行中的其他列无关。
  3. 当需要某行的多列数据的时候按行的数据组织方式更有效。当行中数据不是太多的情况下一次硬盘寻址就可以获得该行的所有数据。
  4. 在新增行数据的时候,如果各列都有值,那么按行的数据组织方式会更有效,因为只需要一次硬盘寻址就可以写入整行的全部数据.

在实际应用中,面向行的数据存储架构更适用于OLTP-频繁交互事务的场景。面向列的数据存储架构更适用于OLAP-(如数据仓库)这样在海量数据((可能达到 terabyte规模))中进行有限复杂查询的场景。

 

列式数据库的代表包括:[HANA], [Sybase IQ]]ParAccelSand/DNAAnalytics Vertica


Vertica的底层存储实现和HBase的不一样。虽然都是叫按列存储,HBase是先将表格按行划分成块,在数据块内部才是按列存储;Vertica的存储比较灵活,它号称可以配置哪些列要放在一起存储,每列都分开就是最基本的按列存储,所有列都和在一起就是按行存储了,不过同一列的数据还是会放在一起。HBase,Cassandra本身只有存储能力,如果要做查询需要借助Hadoop这样的框架进行,Hive就是把查询都编译成Hadoop任务实现的。Hadoop的查询效率要比关系型数据库要低,主要是因为1)Hadoop为了保证容错,中间数据都要走一遍磁盘,IO开销大;2)Hadoop缺少查询优化引擎还有索引等优化机制。


Vertica分析平台关键特性

关于MPP的介绍可以参考我转载的一篇文章SMP、NUMA、MPP体系结构介绍

作者:IT_DREAM_ER 发表于 2017/08/02 09:16:32 原文链接 https://blog.csdn.net/IT_DREAM_ER/article/details/76566848
阅读:756