精华内容
下载资源
问答
  • 什么是列式存储数据库

    千次阅读 2019-10-15 19:52:25
    对我在理解列式存储、以及数据模型、存储模型间关系很有帮助的一篇文章。————————转载-出自此处 正文: 列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,...

    引言: 
    对我在理解列式存储、以及数据模型、存储模型间关系很有帮助的一篇文章。————————转载-出自此处

    正文:

     

    列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,由于查询中的选择规则是通过列来定义的,因此整个数据库是自动索引化的。按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩/解压算法

    传统的行存储和列存储的区别

    这里写图片描a 
    1、数据是按行存储的 
    2、没有索引的查询使用大量I/O 
    3、建立索引和物化视图需要花费大量时间和资源 
    4、面对查询的需求,数据库必须被大量膨胀才能满足性能需求

    这里写图片描述 
    1、数据按列存储–每一列单独存放 
    2、数据即是索引 
    3、只访问查询涉及的列–大量降低系统IO 
    4、每一列由一个线索来处理–查询的并发处理 
    5、数据类型一致,数据特征相似–高效压缩

     

    列式数据库

    什么是列式数据库?可能大家也才到了,既然有列式数据库,那么肯定就有行式的喽!确实是这样的。也许大多数人并不了解数据库储存模型(storage model)和数据库的数据模型(data model),不过对上层是使用者也没多大关系。不过我们现在讲的列式和行式就是指数据库的storage model,而他们支持同样的data schema,即对data model感知不到storage model的实现区别。 
    一个数据库的data model约定可以进行上层数据操作,而storage model决定这些操作的性能。比如,No Sql数据库使用的是data model是key-value,而储存模型有map结构实现,也可以由tree结构实现。而对于sql数据库,其数据模型是一张二维表,而至于怎么存储这张二维表,很容易就可以想到可以按行存储和按列储存。按行存储就是我们现在常见操作型数据库,而是最大众的数据库,比如MySql、Oracle、……等等你所知道大部分数据库。而按列储存的数据库现在也是很有名,比如Hive、Vertica、Druid、Infobright等。

    为什么要行式数据库又要列式数据库?

    先让让我们想象关于二维表我们有哪些操作?—— select、update、delete和insert。这些操作都会需要找到相应的位置,所以这些操作的基础都是search。 
    而基本的算法都是即从时间考虑也是从空间考虑的。我们开始具体举个例子。

    在数据库储存作为实际的一堆储存在磁盘上的文件,在设计不得不考虑磁盘的特性。一般的磁盘特性,其实所有的储存都有一个特性就是对于locality良好的存取性能是随机存取的好几倍。我们现在把一块想像成一组固定大小的块,如图: disk logic model 而文件的内容实际会被分开按照磁盘逻辑块来储存,数据库主要任务就是怎么组织这些逻辑块来取得更好的读取性能和便捷性。 

    在不考虑索引的情况下,所有的磁盘读取都是顺序读取,这意味了要查找一个东西,都需要扫描全表或者部分表。很直观的道理,读取的性能就是取决于扫描的范围。范围越大,速度当然越慢。 
    我们先假设我们有一堆如下的数据:

    RowIdEmpIdLastnameFirstnameSalary
    00110SmithJoe40000
    00212JonesMary50000
    00311JohnsonCathy44000
    00422JonesBob55000

     

    行式储存模型

    好现在我们开始让磁盘里塞,假设我们的磁盘块只能容下5个字段(抽象的,假设我们的这些字段的大小都一样),因为我们是按找行优先的,所以结果就如下: 
    这里写图片描述

    于是当我们要找Jones的所有信息的工资时候,我们会依次从第一块磁盘块直到扫描到最后(为什么要扫到最后,因为是在找全部叫Jones的信息,所以不扫都最后都不能确定是否会遗漏)。一共需要扫4块,然后取出其第二块和第四块信息,找出其工资的信息。

    其实基于行式储存,对于where语句处理都需要处理全表。对于磁盘的不停seek,速度就可想而知。当然一般数据库为了应对这种全数据扫描,找到了建立索引的方法。而索引就是对某个或者某些字段的组合的信息,即取出数据的部分信息,以减少每次扫描从全表到部分信息的扫描的过渡。

    这种查询方式很适合于一次取出一个行数据,而对于日常应用系统来说这种方式是非常合适的,因为我们设计应用的时候都是针对一个事务,而我们会把一个事务所有属性存储成一行,使用的时候也是有很大的概率涉及到整行的信息,很利于做缓存。还比如我们经常使用的那些经典sql 语句:

     
    1. select * from user where id = 1001;

    2. select id, user_name, email, address, gender, ... from user where id = 1001;

    !!还敢不敢列出些更多的字段!!

    列式储存模型

    而列储存就是下图这种按列优先储存。为了方便我们每块只储存了一个一列,没有存满。 

    这下我们再考虑上面的查找所有Jones的工资,这下我们只扫描第三个磁盘块,找出Jones都再那些行,然后根据查出来的行号,直接去第五块磁盘(这块对应的式salary列)找出第二、四行的数据,然后输出。一共2次seek。大大小于row-oriented的4次。

    这种查询方式的前提就是你就需要这列数据就行了,其前提假设就是查询基本不会使用这个行的其他列数据。显然这种假设对于日常操作系统的围绕着一个主题进行的活动是不合适旳。但是却在分析型数据大显身手。

    列式的另一大优势是压缩。因为列的天然凝聚性(比如上面的两个Jones就可以压缩成一个)大大强与行,所以列式储存可以有很高的压缩比,这个进一步使使用的磁盘的数量减少,因为使用的磁盘块少,进一步减少了需要扫描的次数。这方面很利于加快查找速度,但是因为解压缩也是耗时耗内存的过程,所以压缩的控制也是需要一个定平衡点。

    优劣总结

    从上面的例子可以明显看出列式数据库在分析需求(获取特点——每次查询几个维度,通常是)时候,不仅搜索时间效率占优势,其空间效率也是很明显的。特别是针对动辄按T计算的数据量来说,在分布式环境中能进行压缩处理能节省宝贵的内部带宽,从而提高整个计算任务性能。

    展开全文
  • 一分钟搞懂列式与行式数据库

    万次阅读 多人点赞 2017-03-30 17:32:39
    行式与列式的区别和应用场景。

    文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号


    定义


    列式存储(Column-based)是相对于传统关系型数据库的行式存储(Row-based)来说的。简单来说两者的区别就是如何组织表。


    将表放入存储系统中有两种方法,而我们绝大部分是采用行存储的。行存储法是将各行放入连续的物理位置,这很像传统的记录和文件系统。列存储法是将数据按照列存储到数据库中,与行存储类似,下图是两种存储方法的图形化解释。



    应用行式存储的数据库系统称为行式数据库,同理应用列式存储的数据库系统称为列式数据库。随着式数据库的发展,传统的行式数据库加入了列式存储的支持,形成具有两种存储方式的数据库系统。


    传统的关系型数据库,如Oracle、DB2、MySQL、SQL SERVER等采用行式存储法,当然传统的关系型数据库也在不断发展中。随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用;列形式保存的数据满足以查询为主的OLAP应用。


    新兴的Hbase、HP Vertica、EMC Greenplum等分布式数据库采用列式存储,当然这些数据库也有对行式存储的支持比如HP Vertica。


    随着传统关系型数据库与新兴的分布式数据库不断的发展,列存储与行存储会不断融合,数据库系统会呈现双模式数据存放方式,这也是商业竞争的需要。


    区别




    为啥列存储可以大幅降低系统的I/O呢?


    列式存储的主要优点之一就是可以大幅降低系统的I/O,尤其是在海量数据查询时,I/O向来是系统的主要瓶颈之一。通过下面这张图,相信大家能够彻底明白这一点。



    应用场景


    在比较了行式数据库与列式数据库之后,我们更关心的是如何根据业务场景需要选择对应的数据库系统。


    行式更适合OLTP,比如传统的基于增删改查操作的应用。列式更适合OLAP,非常适合于在数据仓库领域发挥作用,比如数据分析、海量存储和商业智能;涉及不经常更新的数据。


    由于设计上的不同,列式数据库在并行查询处理和压缩上更有优势。而且数据是以列为单元存储,完全不用考虑数据建模或者说建模更简单了。要查询计算哪些列上的数据,直接读取列就行。


    最后我们需要务实的指出,没有万能的数据库,列式数据库也并非万能,只不过给DBA提供了更多的选择,DBA需根据自己的应用场景自行选择。



    展开全文
  • 列式存储和行式存储的真正区别

    千次阅读 2019-05-04 11:07:42
    1 列式存储和行式存储的真正区别 参考文献: 列式存储和行式存储的真正区别_过往记忆大数据_公众号文章 一般原因:查询需要的字段时,Column-Store 只需读取需要的列,Row-Store读一条记录会把 所有字段都读出来。...

    1 列式存储和行式存储的真正区别

    参考文献: 列式存储和行式存储的真正区别_过往记忆大数据_公众号文章

    • 一般原因:查询需要的字段时,Column-Store 只需读取需要的列,Row-Store读一条记录会把 所有字段都读出来。Column-Stroe在IO上效率更高。

    • 块遍历
        单记录遍历:读出行,对每行抽取出需要的列,再对这些列调用相应的函数。函数调用的次数与数据的条数为 1 : 1 1:1 1:1
        块遍历:批量处理,一次性处理多条数据,函数调用次数下降,性能提高。
      .
        块遍历和单记录遍历是两种遍历方法,Column-Store和Row-Store都可以使用。区别是:对于Column-Store,块遍历已经成为共识,大家都这样做。对于Row-Store,需要用case-by-case实现。
        并且Column-Store的列值在字节意义上等宽时(例如,每个列都是数字类型),还可以进一步提高性能。因为从一个块里取值时可以直接用数组下标获取数据。以数组的方式我们还可以用现代CPU的一些优化措施比如SIMD(Single Instruction Multiple Data)来实现并行化执行,进一步提高性能。

    • 压缩
      压缩就是对数据进行更高效的编码,从而用更少的空间表达相同的意思。
      而能够进行更高效的编码的前提是数据要有某种规律。比如很多数据一样,或者数据的类型一样。
      Column把一列数据保存在一起,而一列的数据类型相同。当然比Row-Store把一条记录里面不同类型的字段值保存在一起,更有规律,更有规律意味着可以有更高的压缩比。
      数据占用的硬盘空间越少,查询时 IO的时间就越少
      数据压缩之后,要进行处理很多时候也需要解压缩,解压缩也需要花时间,所以一般需要在压缩比和解压速度之间做一个权衡
      有的场景下,可以避免解压缩,直接在压缩数据的格式上进行计算,这样就可以进一步提升性能 。
      最好对数据排序之后,再对Column-Store使用压缩进行优化。如果不经过排序,数据就没那么“有规律”,也就达不到最好的压缩比。

    • 延迟物化
      什么是物化?为了把底层存储格式与用户查询表达的意思对应起来,需要在查询生命周期的某一个时间点,将数据转换成Row的形式,这在Column-Store里面被称为物化
      在这里插入图片描述
      延迟物化就是尽量把物化的时机延迟到查询生命周期的后期。这意味着在查询生命周期的前期,查询执行的模型不是关系代数,而是基于Column。举例:

    select name 
    from person
    where id > 10 and age > 20
    

    一般的做法,取出三列,立刻物化成一行行的Person数据(同一个Person在三列里的数据,抽取出来构成一行),然后应用过滤条件(id > 10 and age > 20)选出对应的行,再从剩下的行中抽出需要的字段(name)。
    在这里插入图片描述
    延迟物化,先不拼出行式数据,直接在 Column数据(id、age)上分别应用两个过滤条件,得到两个满足过滤条件的bitmap,然后两个bitmap做位与(bitwise AND)得到同时满足两个条件的所有的bitmap(Intersected bitmap,position)。因为需要的只是name字段,所以下一步拿着这些position对name字段的数据进行过滤得到最终的结果。
    在这里插入图片描述
    可以发现整个过程中压根没有进行物化操作,从而可以提高效率。

    展开全文
  • 列式存储简介

    千次阅读 2018-07-13 15:24:19
    关系表结构是被人们普遍接受的数据模型,通常一行数据由多个属性组成,每个属性是一。但是磁盘是一维的,文件只能顺序写,那么先写谁后写谁呢?不同的写文件顺序就对应了不同的存储模型。传统数据库通常采用行...

    业务背景

    关系表结构是被人们普遍接受的数据模型,通常一行数据由多个属性组成,每个属性是一列。但是磁盘是一维的,文件只能顺序写,那么先写谁后写谁呢?不同的写文件顺序就对应了不同的存储模型。传统数据库通常采用行式存储,即先存一行数据,再存下一行数据。

    在大数据时代,一个常见分析型场景是在数据仓库中进行分析,如商店的商品信息,有商品号,进货日期,价格等包含多个属性,这就是一个很常见的数据模型。而查询很多时候是计算某个属性上的聚合值,比如计算一个地区的平均身高,所有人的平均年龄等。列式存储通常将不同数据的同一个属性值存在一起,在查询时只遍历需要的数据。因为每一个属性在表中就是一列,所以很直观的就叫列式存储。(东哥曾经很流氓的跟我说,你把表转过来看,其实行式存储也是列式存储。。。)

    针对这种场景,但不仅限于这种场景,出现了很多列式存储的文件格式和存储系统,比如 Parquet,CarbonData,Cassandra等。并且在大数据时代的分析型场景下碾压了传统的关系型数据库,于是提出了新名词 NoSQL,Not only SQL,不仅仅是SQL,本意是去掉关系数据库中对事务的支持,在大数据场景事务的概念太重了。

    这里写图片描述

    采用行式存储时,数据在磁盘上的组织结构是:

    这里写图片描述

    有啥好处呢,假如你想查一个人的所有属性,可以通过一次磁盘 seek 加顺序读取就可以了。但是当我只想查所有人的年龄时,需要不停的seek、seek,或者将所有数据扫描一遍,遍历了很多没用的数据。

    采用列式存储时,数据在磁盘上的组织结构是:

    这里写图片描述

    这时,当我想查所有人的年龄,这样我只用一次磁盘 seek 加顺序读取所有人的年龄字段就可以了。

    列式存储、查询引擎

    列式存储只是一个很宽泛的概念,将各个属性维度的数据存在一起,这只是一种存储格式,或者说文件的组织方式。但是仅仅有存储格式是不足以实现一个列存系统的。为了继续细化到执行层面,将其丰富成一个系统。还需要有相应的写入流程和查询流程与之对应,在这个过程中就大有可为了。

    压缩

    在定义表的时候,每一列都是一种数据类型,这样就可以使用针对数据类型的压缩方法将数据压缩,压缩可以达到一个数量级的性能提升。当某一列被排序之后,可以达到更高的压缩比。压缩的意义不仅在于降低磁盘占用,毕竟磁盘越来越便宜,这个意义会越来越小。压缩的意义更多在于加速查询,如减少了磁盘IO,或者直接操作压缩后的数据来降低 CPU 代价。

    拼接

    这个刚开始不能说是优点,应该是必须解决的问题。将数据按列存储是很好,但是有一个必须要解决的问题,那就是一个数据项的多个属性被分开存放在不同地方了,一个查询也会同时访问多个属性,并且 JDBC 等接口还是以一行为单位返回结果的。因此,多列数据拼接在列式存储中是一个必不可少的操作。

    第一个问题是,怎么拼接?

    一个数据项的各个属性分开放了,我怎么知道谁对应谁?一般来说,是按顺序拼接的。比如,第一个数据项的三个属性在三个列的位置都是1,以此类推。

    读的时候可以根据下标将各属性拼接起来。

    第二个问题是,什么时候拼接?

    如果说拼接刚开始只是列式存储不得不解决的问题,那么延迟拼接则应该是列式存储为了解决拼接问题而发掘出来的优势了。

    假如一个表里有100列,有一个查询 select c3 from table1 where c1>10 and c2>5

    第一种方式是行式过滤的思想,先将c1,c2,c3 三列读出来,拼接成一个一个数据项,再对每行数据项的 c1,c2 的值进行 c1>10 and c2>5 的过滤。这个暂且叫预先拼接。

    第二种方式是延迟拼接,将谓词下推至各个列,先记录 c1 列中满足 c1>10 的所有数据下标 A,再记录 c2 列中满足 c2>5 的所有数据下标 B,将 A 和 B 合并成 C,并用 C 去读 c3 列。实践证明这种方式更能发挥列式存储的优势。

    SQL语句中的谓词就是where语句后的过滤条件,如等于,小于,大于等于。

    块遍历

    这个比较底层了,涉及CPU的指令执行优化等(其实我也不太了解,有个概念就行了~)。行式存储的查询中,需要将每行数据进行需要过滤的属性抽取,并进行过滤操作,负载很重。列式存储中不需要属性抽取,可以直接将一列的一段数据当做一个数组交给一个 filter,遍历数组的代价比对每个对象进行遍历负载要轻,并且可以利用CPU的并行能力。

    行存和列存只是不同的维度而已,没有天生的优劣(打自己脸:列存天生适合压缩)。大数据时代大部分的查询模式决定了列式存储优于行式存储。一般来说,列式存储不仅包括数据是按列存在磁盘上的,还包括针对这种格式的存储和查询引擎。关于列式存储就介绍这么多,有兴趣可以再去看看 Parquet、CarbonData。

    欢迎关注个人公众号:数据库漫游指南

    这里写图片描述

    展开全文
  • clickhouse 列式存储数据库介绍

    千次阅读 2019-01-30 19:36:04
    ClickHouse介绍 ClickHouse来自哪里? 俄罗斯最大的搜索公司Yandex,在clickhouse的配置文件中我们也会看到yandex的影子。 ClickHouse是什么? ClickHouse是一个开源的...什么是列式数据库? 相对行式数据库,像M...
  • 5分钟图解Hbase列式存储

    千次阅读 2019-01-24 19:35:50
    作者 | 李新杰 来源 | 微信公众号“编程新说” 行式存储 传统的数据库是关系型的,且是按行来存储的。如下图: ...其中只有张三把一行数据填满了,李四王五赵六的...列式存储 为了与传统的区别,新型数据库叫做非...
  • OLTP、OLAP和列式存储数据库

    千次阅读 2019-06-20 16:34:07
    1)行式存储按一行一行进行存储数据,列式存储服务器按一列一列存储数据,具体数据结构如下图所示: 2)列式存储和行式存储的优势在于:   优点 缺点 行式存储 1)数据被保存在一起; ...
  • SAP HANA: 列式内存数据库评测

    千次阅读 2014-01-20 13:24:13
    SAP HANA: 列式内存数据库评测
  • 一个解释是行列就是行列中的行或向量所构成的超平行多面体的有向面积或有向体积;(显然这个比较容易接受) 另一个解释是矩阵A的行列detA就是线性变换A下的图形面积或体积的伸缩因子。 举个栗子~ 用三维...
  • Hadoop列式存储引擎Parquet/ORC和snappy压缩 原文 http://www.itweet.cn/2016/03/15/columnar-storage-parquet-and-orc/ 主题 Parquet Hadoop 相对于传统的行式存储格式,列式存储引擎具有更高的...
  • 行列性质 将任意一行或者的任意倍数加到另一行(),其行列不变 理解: 就是将面积或者是体积平推一定的位置,平推平移又不会改变行列的大小
  • CRT是什么意思?LCD又是什么意思

    千次阅读 2008-11-20 17:41:00
    CRT是什么意思?LCD又是什么意思 CRT(Cathode Ray Tube)是阴极射线管。是应用较为广泛的一种显示技术。CRT投影机把输入的信号源分解到R(红)、G(绿)B(蓝)三个CRT管的荧光屏上,在高压作用下发光信号放大、...
  • NS前缀是什么意思

    千次阅读 2020-01-09 09:36:46
    Cocoa / Cocoa Touch中的许多类都有NS前缀。 这是什么意思
  • 【转】非侵入设计 和侵入设计 意思? 非侵入系介绍DI用语,我得理解是两个组件(类,接口)之间,比较独立,不深入到另一个类内部,哪位大虾能点拨一二? 关于“侵入”和“非侵入”  有...
  • 大调小调是什么意思

    千次阅读 2012-11-27 14:18:48
    大调小调是什么意思? 一: 1. 由七个音组成的一种调,其稳定音为1(do),这样的调就称为大调. 大调色彩明亮,大调一般用于进行曲,或者欢快的曲子。 2.由七个音组成的一种调,其稳定音为6(La),这样的调...
  • NP是什么意思

    千次阅读 2018-09-27 21:37:00
    的Hubert Chen博士提供了这个玩笑的P不等于NP的证明:“反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在 多项式时间 内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP...
  • 凡是对电脑有所了解的朋友都知道内存这玩意,可是,可能有不少朋友对内存的认识仅仅局限在SDRAM和DDR SDRAM这两种类型,...以下就让我们看看内存到底有些什么种类吧! 一、RAM(Random Access Memory,随机存取存
  • 什么是二阶行列

    千次阅读 2019-03-20 14:01:28
    文章转载至人工智能中文网 二阶行列,用于快速解二元线性方程组。例如,下面这个二元线性方程组: ...此时可见,两子中的 x2的系数相同,此时可用第一个子减去第二个子,就可消去 x2...
  • 列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据即是索引。 只访问查询涉及的列,大大降低了系统I/O,每一列由一个线来处理,而且由于数据类型一致,数据特征相似,极大方便压缩。 第一...
  • 输出的信息是什么意思? top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。 top - 01:06:48 up 1:22, 1 user, load ...
  • 黎曼猜想到底是什么意思

    千次阅读 2019-04-02 10:04:58
    整个子的意思就是,通过修正项调整之后,黎曼给出的素数计数函数  就完全等于  了。 5.1   函数与非平凡零点 要把   介绍清楚,先得引入一个   函数 : 为什么自变量用   ,不用   呢?...
  • k阶子:指在行列中任取k行k组成的行列。k行k是任意组合没有限定要求,只要行列相等即可。 k阶主子:指在行列中选k行k,但要求行和的下标相同。如:行为r1、r2、r3,必须为c1、c2、c3;行为r2、...
  •  列式存储被视为NoSQL数据库中非常重要的一种模式,其中 Cassandra 流行度最高,它已经由Facebook转交给到Apache进行管理,同时Cassandra在全体数据库排名中排在第十位,紧随MongoDB成为第二受欢迎的NoSQL数据库。...
  • 在linux的top命令里的cpu信息是什么意思呢? Cpu(s): 62.1% us, 15.9% sy, 0.1% ni, 19.4% id, 2.0% wa, 0.1% hi, 0.4% si Mem: 8247956k total, 8232004k used, 15952k free, 205240k buffers Swap: 8191
  • 01 为什么合同变换总是一对...在用合同变换计算二次型XTAXX^TAXXTAX的标准形时,要求对分块矩阵(AE)\begin{pmatrix} A\\E \end{pmatrix}(AE​)每进行一个行变换时都要接着做一个相应的变换,为什么是这样呢? ...
  • k阶子是在行列中任取k行k组成的行列,k行k是任意组合没有限定要求,只要行列相等即可; 主子也是选k行k,但行列下标要相同,如行为a1、a2、a3,必须为b1、b2、b3;行为a2、a3、a5,必须为b2、b3...
  • 理解HBase面向存储

    千次阅读 2019-11-06 14:03:31
    从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储。行式存储 传统的数据库是关系型的,且是按行来存储的。如下图: 其中只有张三把一行数据填满了,李四王五赵六的行都没有填满。因为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,751
精华内容 44,300
关键字:

列式是什么意思