`

列数据库 转

 
阅读更多

 

转 http://www.csdn.net/article/2012-05-31/2806184

 

最早的商业列式数据库是在1995年发布的Sybase IQ,但是一直到1999年左右才慢慢稳定到能够投入生产环境。现在的大多数分析型数据库都是在2003-2005年从Postgresql分支出来的。这篇文章解释介绍列式数据库的几大特点。

1.高效的储存空间利用率

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

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

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

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

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

2.不可见索引

列式数据库由于其数据的每一列都按照选择性进行排序,所以并不需要行式数据库里面的索引来减少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’ 的时候就会停止扫描了。这相当与行式数据库索引里的范围扫描。

3.数据迭代 (Tuple Iteration)

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

4.压缩算法

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

5.延迟物化

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

(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)表现比较好,有些没有针对更新的数据库表现比较差。
  • 不适合做含有删除和更新的实时操作。

常见误区

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

分享到:
评论

相关推荐

    数据库动态生成列数据库纵向列转横向列

    ### 数据库动态生成列——数据库纵向列转横向列 #### 背景介绍 在数据库管理与数据分析领域,经常会遇到需要将数据从一种格式转换到另一种格式的需求,尤其是在处理报表或者进行复杂的数据分析时。例如,有时候我们...

    主流数据库行转列实例

    主流数据(ORACLE,DB2)行转列实例,包括2种实现方式,通过case..when和left join..on;大牛补充其他的实现方式。

    列式数据库存储原理列式数据库存储原理

    ### 列式数据库存储原理详解 #### 一、引言 在大数据时代,随着数据量的不断增长,传统的行式数据库已经无法满足高效查询的需求。列式数据库作为一种新型的数据存储方式,通过改变数据的存储结构,实现了对大量...

    Sql语句实现表的行列转换,行转列,列转行

    ### SQL语句实现表的行列转换,行转列,列转行 在处理数据库时,我们经常需要对数据进行各种变换以适应不同的分析需求。其中,“行列转换”就是一种非常实用的功能,它可以帮助我们将表中的行数据转换为列数据,...

    列数据库的SQL查询语句编译与优化.pdf

    列数据库是一种新兴的数据库技术,主要用于处理海量数据和复杂查询。它与传统的关系型数据库不同,后者按照行来存储数据。列数据库按照列来存储数据,这种存储方式带来了以下几个优势: 1. **I/O带宽利用优化**:在...

    数据库结构转换数据库文档

    6. **权限和角色**:列出用户和角色的访问权限,对于数据库安全至关重要。 7. **触发器**:定义在特定事件下自动执行的代码,用于实现业务逻辑或数据验证。 "db-generator-master"这个文件可能是一个开源项目,它...

    数据库表转实体类和DTO

    - **数据库表**:在关系型数据库中,表是一种存储数据的基本结构,由行和列组成,每一行代表一条记录,每一列对应一种属性或字段。数据库表通过定义字段类型、长度、约束等规则来规范数据。 - **实体类**:在Java...

    oracle动态行转列

    其中,“行转列”(Pivot)是一种常见的数据转换需求,尤其在数据分析和报告生成时尤为重要。本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    sql动态行转列 存储过程

    在SQL数据库操作中,"行转列"是一种常见的数据转换需求,它将表格中的多行数据转换为单列显示,通常用于数据汇总和分析。在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在...

    数据库表行转列

    数据库里的,表里的行转列

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...

    \edb数据库转Excel模块

    edb数据库转Excel模块是专为处理edb数据库文件并将其转换为常见的Excel电子表格格式而设计的一个工具或软件组件。在IT行业中,数据转换是至关重要的,尤其当涉及到不同系统之间的数据交互时。edb数据库通常是由某些...

    KETTLE数据库转换类型例子

    在这个过程中,Kettle会将文本文件中的每一行数据映射到数据库表的列,根据预定义的映射关系进行数据转换。对于给定的2006.csv文件,其内容包含学号、姓名和其他评分项,Kettle会解析这些字段并创建相应的XML输出。...

    实体类转换成数据库表

    这些类通常包含由`@Entity`注解标识,并且它们的属性与数据库表的列相对应。属性上的`@Id`注解表示主键,其他注解如`@Column`用于指定列名和特性。 3. **映射(Mapping)**: 映射是将实体类与数据库表关联的过程。...

    h2数据导入mysql数据库(看评论酌情下载)

    注意,粘贴数据时一定要从第一行第一列开始,否则可能会出现错误。 最后,需要将 Excel 文件中的数据导入到 MySQL 数据库中。这里可以右键点击 test 数据库下的某一张表,选择 "导入"-"MC Excel 文件",然后选择...

    SQL语句行列转换(附带数据库、表、视图操作)

    SQL 语句行列转换是数据库管理系统中的一种常见操作,它可以将数据从行转换为列,或者从列转换为行。在这个过程中,需要使用数据库管理语言(Database Management Language,DML)来实现数据的转换。下面我们将详细...

    access行转列示例

    Access作为一款流行的桌面级数据库管理系统,提供了丰富的数据操作功能,其中包括“行转列”和“列转行”的操作,这对于数据展示和分析有着极大的便利性。在本文中,我们将深入探讨Access中的这种转换方法及其实际...

Global site tag (gtag.js) - Google Analytics