开发用了很久的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)表现比较好,有些没有针对更新的数据库表现比较差.
不适合做含有删除和更新的实时操作.
下面简单罗列了一些选择行数据库还是列数据库的权衡依据。当然,如果能够把数据全放在内存中,那么使用内存数据库性能会更好。
- 在只需要根据某几列来聚合数据的时候按列的数据组织方式更有效。因为这样只需要读取一部分数据,要比读取全部数据更快.
- 当只需要修改某一列值的时候按列的数据组织方式更有效。因为可以直接找到某列数据并修改,而与行中的其他列无关。
- 当需要某行的多列数据的时候按行的数据组织方式更有效。当行中数据不是太多的情况下一次硬盘寻址就可以获得该行的所有数据。
- 在新增行数据的时候,如果各列都有值,那么按行的数据组织方式会更有效,因为只需要一次硬盘寻址就可以写入整行的全部数据.
在实际应用中,面向行的数据存储架构更适用于OLTP-频繁交互事务的场景。面向列的数据存储架构更适用于OLAP-(如数据仓库)这样在海量数据((可能达到 terabyte规模))中进行有限复杂查询的场景。
列式数据库的代表包括:[HANA], [Sybase IQ]],ParAccel, Sand/DNAAnalytics和 Vertica。
Vertica分析平台关键特性
- 实时查询 & 加载 »通过不断加载的信息,获取数据的时间价值,同时允许立即进行丰富的分析。
- 高级的库内分析 »不断增长的特点和功能库,展示和处理更多和CPU内核紧密结合的数据,而无需解压。
- 数据设计 & 管理工具 »强大的设置,调整和控制以达到使用最小的管理工作,就可以进行持续改进,而系统仍然保持在线。
- 列式存储 & 执行 »执行查询快50 - 1000倍,消除了昂贵的磁盘I / O,没有的索引和物化视图的麻烦和开销。
- 强劲的数据压缩 »我们的引擎,以较少的资本性支出完成更多的压缩数据,同时提供卓越的性能。
- 可扩展的MPP架构 »Vertica的自动和无限线性扩展,只需在网格中添加行业标准x86服务器 …
- 自动的高可用性 »不间断地运行与优化,提供卓越的查询性能,良好的自动冗余,故障切换和恢复。… .
- 优化器 执行引擎 & 负载管理 »获得最大的性能,而无需担心它如何工作的细节。用户只思考有关的问题,我们快速地提供答案。
- 内在的 BI, ETL, & Hadoop/MapReduce 集成 »一个强大和不断增长的生态系统的分析解决方案的无缝集成。