列式数据库

最早的商业列式数据库是在1995年发布的Sybase IQ,但是一直到1999年左右才慢慢稳定到能够投入生产环境。现在的大多数分析型数据库都是在2003-2005年从Postgresql 分支出来的。其中尤其是Vertica 为代表的列数据库已经在大规模数据仓库环境中证明其特别为数据仓库环境设计的思路在一些领域具有竞争优势。这篇文章解释介绍列式数据库的几大特点。

  高效的储存空间利用率

传统的行式数据库由于每个列的长度不一,为了预防更新的时候不至于出现一行数据跳到另一个block 上去, 所以往往会预留一些空间。而面向列的数据库由于一开始就完全为分析而存在,不需要考虑少量的更新问题,所以数据完全是密集储存的。

  行式数据库为了表明行的id 往往会有一个伪列rowid 的存在。列式数据库一般不会保存rowid。

  列式数据库由于其针对不同列的数据特征而发明的不同算法使其往往有比行式数据库高的多的压缩率,普通的行式数据库一般压缩率在3:1 到5:1 左右,而列式数据库的压缩率一般在8:1到30:1 左右。(InfoBright 在特别应用可以达到40:1 , Vertica 在特别应用可以达到60:1 , 一般是这么高的压缩率都是网络流量相关的)

  列式数据库由于其特殊的IO 模型所以其数据执行引擎一般不需要索引来完成大量的数据过滤任务(Sybase IQ 除外) 。这又额外的减少了数据储存的空间消耗。

  列式数据库不需要物化视图,行式数据库为了减少IO 一般会有两种物化视图,常用列的不聚合物化视图和聚合的物化视图。列式数据库本身列是分散储存所以不需要第一种,而由于其他特性使其极为适合做普通聚合操作。(另外一种物化视图是不能实时刷新的,比如排名函数,不规则连接connect by 等等,这部分列数据库不包括。)

  不可见索引

列式数据库由于其数据的每一列都按照选择性进行排序,所以并不需要行式数据库里面的索引来减少IO 和更快的查找值的分布情况。如下图所示: 当数据库执行引擎进行where 条件过滤的时候。只要它发现任何一列的数据不满足特定条件,整个block 的数据就都被丢弃。最后初步的过滤只会扫描可能满足条件的数据块。

  (from InfoBright : Blazing Queries Using an Open Source Columnar Database for High Performance Analytics and Reporting )

  另外在已经读取了可能的数据块之后,对于类似age < 65 或 job = ‘Axx’ 的,列式数据库并不需要扫描完整个block,因为数据已经排序了。如果读到第一个age=66 或者 Job = ‘Bxx’ 的时候就会停止扫描了。这相当与行式数据库索引里的范围扫描。

  数据迭代 (Tuple Iteration)

现在的多核CPU 提供的L2 缓存在短时间执行同一个函数很多次的时候能更好的利用CPU 的二级缓存和多核并发的特性。而行式数据库由于其数据混在一起没法对一个数组进行同一个简单函数的调用,所以其执行效率没有列式数据库高。

  压缩算法

列式数据库由于其每一列都是分开储存的。所以很容易针对每一列的特征运用不同的压缩算法。常见的列式数据库压缩算法有Run Length Encoding , Data Dictionary , Delta Compression , BitMap Index , LZO , Null Compression 等等。根据不同的特征进行的压缩效率从10W:1 到10:1 不等。而且数据越大其压缩效率的提升越为明显。

  延迟物化

列式数据库由于其特殊的执行引擎,在数据中间过程运算的时候一般不需要解压数据而是以指针代替运算,直到最后需要输出完整的数据时。

  (from McKnight : Columnar Database : Data Does the Twist and Analytics Shout)

  传统的行式数据库运算, 在运算的一开始就解压缩所有数据,然后执行后面的过滤,投影,连接,聚合操作

  而列式数据库的执行计划却是这样的。

  (from McKnight : Columnar Database : Data Does the Twist and Analytics Shout)

  在整个计算过程中, 无论过滤,投影,连接,聚合操作,列式数据库都不解压数据直到最后数据才还原原始数据值。这样做的好处有减少CPU 消耗,减少内存消耗,减少网络传输消耗,减少最后储存的需要。

  列式数据库优缺点

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

  列式数据库优点:

  • 极高的装载速度 (最高可以等于所有硬盘IO 的总和,基本是极限了)
  • 适合大量的数据而不是小数据
  • 实时加载数据仅限于增加(删除和更新需要解压缩Block 然后计算然后重新压缩储存)
  • 高效的压缩率,不仅节省储存空间也节省计算内存和CPU。
  • 非常适合做聚合操作。

  缺点:

  • 不适合扫描小量数据
  • 不适合随机的更新
  • 批量更新情况各异,有的优化的比较好的列式数据库(比如Vertica)表现比较好,有些没有针对更新的数据库表现比较差。
  • 不适合做含有删除和更新的实时操作。

  常见误区

  一个常见的误区认为如果每次扫描较多行或者全列全表扫描的时候,行式数据库比列式数据库更有优势。事实上这只是行式数据库认识上的一个误区,即认为列式数据库的主要优势在于其列分开储存,而忽略了列式数据库上面提到的其他几大特征,这个才是列式数据库高性能的核心。

时间: 2024-08-10 10:09:21

列式数据库的相关文章

浅析列式数据库的特点

转自: http://www.searchdatabase.com.cn/showcontent_61985.htm  最早的商业列式数据库是在1995年发布的Sybase IQ,但是一直到1999年左右才慢慢稳定到能够投入生产环境.现在的大多数分析型数据库都是在2003-2005年从Postgresql 分支出来的.其中尤其是Vertica 为代表的列数据库已经在大规模数据仓库环境中证明其特别为数据仓库环境设计的思路在一些领域具有竞争优势.这篇文章解释介绍列式数据库的几大特点. 高效的储存空间

列式数据库与行式数据库分析

1,行式数据库 定义:存储格式按照'行'的方式把一行各个字段的数据存储在一起,一行行连续存储. 图 1 把一条数据的信息写到数据库中:或者对一条数据中的某些字段进行修改:或者删除整条数据一类的OLTP操作来说既直观也高效. 但是,在行式数据库上做一些报表.分析的时候,大家又发现这种存储格式使用效率不高.例如:统计各省份的销售额和利润同比变化:按照部门统计业绩完成情况等等,都是在其中某些字段上的操作,行式数据库不分情况一律按照页面读取数据的方式,在只分析销售额和利润的时候,把每一份合同的其他信息,

什么是行式数据库,什么是列式数据库

数据库以行.列的二维表的形式存储数据.可是却以一维字符串的方式存储.比例如以下面的一个表: EmpId Lastname Firstname Salary 1 Smith Joe 40000 2 Jones Mary 50000 3 Johnson Cathy 44000 这个简单的表包含员工代码(EmpId), 姓名字段(Lastname and Firstname)及工资(Salary). 这个表存储在电脑的内存(RAM)和存储(硬盘)中.尽管内存和硬盘在机制上不同,电脑的操作系统是以相同的

列式数据库的简单分析

转自:列式数据库的简单分析 这些天看数据仓库的内容,发现一个新内容——列式存储.曾经有想过把数据库行列转置作成索引,不过没有深想,没想到列式数据库已经开始发展起来了.首先看下WIKI上对列式数据库的解释: 列式数据库是以列相关存储架构进行数据存储的数据库,主要适合与批量数据处理和即席查询.相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合与小批量的数据处理,常用于联机事务型数据处理.数据库以行.列的二维表的形式存储数据,但是却以一维字符串的方式存储,例如以下的一个表:EmpI

列式数据库~clickhouse日常管理

clickhouse日常管理一 变量相关  1 查看变量     system.setting相关表  2 设置变量     set variables= 请注意这里是session级别,如果想永久生效,必须修改配置文件  3 变量文件分类     config.xml      说明 config.xml针对的是server级别的限制,包括不仅限于内存,复制集,分布式,数据目录等设置     user.xml     说明 user.xml针对的是用户级别的限制,主要包括用户增删查改的内存控制

数据库为什么会分为“行式存储”和“列式存储”呢?

我们知道 当今的数据处理大致可分为两大类 联机事务处理 OLTP (on-line transaction processing) 以及联机分析处理 OLAP (On-Line Analytical Processing) OLTP 是传统关系型数据库的主要应用 用来执行一些基本的.日常的事务处理 比如数据库记录的增.删.改.查等等 而 OLAP 则是分布式数据库的主要应用 它对实时性要求不高,但处理的数据量大 通常应用于复杂的动态报表系统上 OLTP与OLAP的主要区别 OLTP与OLAP 在

HBase 是列式存储数据库吗

在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理(OLAP)和即时查询.相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理(OLTP). 比如我们有以下的表格: 那么行式数据库和列式数据库存储模型分别如上面的左图和右图.可以看到,行式数据一行的

Linux系统:Centos7下搭建ClickHouse列式存储数据库

本文源码:GitHub·点这里 || GitEE·点这里 一.ClickHouse简介 1.基础简介 Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据.ClickHouse不应该被用作通用数据库,而是作为超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询速度非常快. 下载仓库:https://repo.yandex.ru/clickhouse 中文文档:https://clickhou

列式存储设计实战

背景: 开发个学生系统,数据库设计. 设计实施: 传统数据库学生表行设计 学号 姓名 性别 年龄 1 张三 男 16 2 李红 女 15 3 王五 男 16 当想扩展属性时,相对应的会增加字段. 学号 姓名 性别 年龄 住址 1 张三 男 16 河南 2 李红 女 15 湖北 3 王五 男 16 北京 实际开发中这样做的缺点: 1:属性字段向主表加,会导致列越来越多,增加表拆分成本. 2:  增加字段,程序中实体模型,SQL查询字段,DTO及文档数据模型都要跟着发生变化,增加成本. 3:查询单个