版权归原作者所有,如有侵权,请联系我们

[科普中国]-列式属性

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

在数据库中,实体所具有的某一方面的特性。一个实体可以由若干个属性来刻画。如公司员工实体有员工编号、姓名、年龄、性别等属性。列式属性是以关系数据库中的属性(列)为单位进行数据存储,将数据表记录中的同一属性值存储在一起,而一条记录中不同的属性值则分别存放在不同的存储单元中。

列式数据库数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。

列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理。因为硬盘寻址时间相较于计算机上其他部件的运行速度来说慢的不是一般,所以常用相同工作负载下的硬盘访问性能来比较行数据库和列数据库。顺序读取数据要比随机访问更快。硬盘寻址时间的提升比起CPU速度的进步要慢得多 ,在使用硬盘作为存储媒介的系统上这种情况很可能还会持续一段时间。下面简单罗列了一些选择行数据库还是列数据库的权衡依据。如果能够把数据全放在内存中,那么使用内存数据库性能会更好。在只需要根据某几列来聚合数据的时候按列的数据组织方式更有效。因为这样只需要读取一部分数据,要比读取全部数据更快。当只需要修改某一列值的时候按列的数据组织方式更有效。因为可以直接找到某列数据并修改,而与行中的其他列无关。当需要某行的多列数据的时候按行的数据组织方式更有效。当行中数据不是太多的情况下一次硬盘寻址就可以获得该行的所有数据。在新增行数据的时候,如果各列都有值,那么按行的数据组织方式会更有效,因为只需要一次硬盘寻址就可以写入整行的全部数据。在实际应用中,面向行的数据存储架构更适用于OLTP-频繁交互事务的场景。面向列的数据存储架构更适用于OLAP-(如数据仓库)这样在数据((可能达到 terabyte规模))中进行有限复杂查询的场景。列式数据库在数据分析、 存储、 BI (商业智能) 这3 个领域有着显著的优势, 这是传统行式数据库所不擅长的,列式数据库甚至能解决行式数据库无法想象的问题。1996~2009年间 Sybase 公司推出的产品中 Sybase iq逐渐成为了列式存储的独立产品。并在其中添加了对BLOB、CLOB、WEB services、XML 的支持;增加了OLAP函数、优化了子查询的性能,使得整个数据库的查询分析能力得到了大幅提高, 同时提高了数据加载速度; 增加了并发查询架构,使其适应了多核技术,同时通过信息生命周期管理技术提高了数据的管理效率加强了数据管理、监控、分析等图形工具支持。

行式存储数据库在传统行式数据库中,数据是按行来存储的,每一行数据包含不同类型的数据,反映到存储结构中,即先存储完一行数据,置一个行标记再存储下一行数据而列式数据库是通过列来存储的,每一列的数据具有相同的数据类型,体现为存储结构中是先存储好一列数据,再进行下一列数据的存储。在存储结构上,行式存储数据库中的数据是以数据文件的形式存储的;数据文件的基本单位是块和页;数据块内的结构分为块头与数据区;索引与数据文件是分离的。传统行式数据库的存储结构决定了它有如下的特点:方便进行数据的插入与更新操作;没有索引的查询将会使用大量的I/O;建立索引和物化视图需要花费大量时间和资源;面对查询的需求,数据库必须被大量膨胀才能满足性能要求1。

优缺点列存储数据库与行存储数据的本质区别在于存储结构的不同,在行存储数据库中,数据是以记录或行为单位进行存储的,而在列存储数据库中,同一个列的值被存放在同一个存储单元中。正是由于这个差别,当列式数据库与行式数据库相比较时,列式数据库系统中的列由于是分开存储的,它的数据相对独立,进行数据存储或压缩等操作的时候也相对独立,不会影响到其它列。具体来说,列式数据库具有如下优势当我们执行一个SQL语句时,它可以将SQL语句分解为若干个可独立执行的、基于列的原子操作,列式数据库只需将涉及到的列读入内存或高速缓存即可,大大节省了带宽。列式数据库执行引擎在访问数据时是以列为基本单位的,这不同于行式数据库对记录进行按顺序的逐条访问。列数据库对属性值的访问有顺序访问、跳跃访问和随机访问种方式。由于数据都以列的形式存储,所以在语句执行过程中,节省了行数据库中映射运算的开销。同一个存储单元中的数据具有相同的数据类型,这些数据所有相同的特征,可以进行高效的压缩操作。由于在列式数据库中可以进行轻量级的压缩,即可以在不解压的情况下直接对压缩态的数据进行操作,它的查询效率高于行式数据库。列存储数据库系统也存在以下缺点:增加了磁盘寻址的时间。当并行读取多列时,需要从磁盘读取多个数据块的数据,这种代价可以通过增加预取数据的磁盘空间得到降低。增加了插入数据所用的开销。在列数据库中要进行插入操作,需要寻找每个属性列的位置,其执行效率非常低,这种开销可以通过批量进行插入数据来予以降低。

增加了元组重构的代价。为了给列数据库提供一个标准的通用关系数据库接口,如ODBCJDBC等,必须在查询计划中将不同属性列重组成元组,虽然该操作可以在内存中进行,但是执行该操作所花费的CPU代价非常高。在通常情况下,可以采用延时物化技术降低该操作的代价。

本词条内容贡献者为:

吴晨涛 - 副研究员 - 上海交通大学