数据库行存储及列存储详解

数据库行存储及列存储详解本文参见:https://blog.csdn.net/Xingxinxinxin/article/details/80939277未完待修改…………………..一.数据处

大家好,又见面了,我是你们的朋友全栈君。

 本文参见:https://blog.csdn.net/Xingxinxinxin/article/details/80939277

未完待修改…………………..

 一.数据处理类型

  • 联机事务处理 OLTP(on-line transaction processing)
  • 联机分析处理 OLAP(On-Line Analytical Processing)

区别:

  • OLTP 是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,比如数据库记录的增、删、改、查等等
  • OLAP 则是分布式数据库的主要应用,它对实时性要求不高,但处理的数据量大,通常应用于复杂的动态报表系统上。

<span role="heading" aria-level="2">数据库行存储及列存储详解

<span role="heading" aria-level="2">数据库行存储及列存储详解

 

二.行式存储和列式存储

  • Row-based storage storesatable in a sequence of rows.
  • Column-based storage storesatable in a sequence of columns.

传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。

列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础的逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。

<span role="heading" aria-level="2">数据库行存储及列存储详解

从上图可以很清楚地看到,行式存储下一张表的数据都是放在一起的,但列式存储下都被分开保存了。所以它们就有了如下这些优缺点对比:

1.在数据写入上的对比

1)行存储的写入是一次完成。如果这种写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,数据的完整性因此可以确定

2)列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多(意味着磁头调度次数多,而磁头调度是需要时间的,一般在1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际时间消耗会更大。所以,行存储在写入上占有很大的优势

3)还有数据修改,这实际也是一次写入过程。不同的是,数据修改是对磁盘上的记录做删除标记。行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。所以,数据修改也是以行存储占优

2.在数据读取上的对比

1)数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。

2)列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题。

3) 两种存储的数据分布。由于列存储的每一列数据类型是同质的,不存在二义性问题。比如说某列数据类型为整型(int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。所以,列存储的解析过程更有利于分析大数据。

4)从数据的压缩以及更性能的读取来对比

 <span role="heading" aria-level="2">数据库行存储及列存储详解

<span role="heading" aria-level="2">数据库行存储及列存储详解

图列分析:首先将Customes Name列及Material列做逻辑化索引标识,查询时分别匹配Materia=Refrigerator及Customes Name=Miller的数据,然后做交叉匹配

3.优缺点

1)行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。

2)列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。查询过程中,可针对各列的运算并发执行(SMP),***在内存中聚合完整记录集,***可能降低查询响应时间;可在数据列中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。

<span role="heading" aria-level="2">数据库行存储及列存储详解

4.使用场景

  如果你大部分时间都是关注整张表的内容,而不是单独某几列,并且所关注的内容是不需要通过任何聚集运算的,那么推荐使用行式存储。原因是重构每一行数据(即解压缩过程)对于HANA来说,是一个不小的负担。列式存储的话,比如你比较关注的都是某几列的内容,或者有频繁聚集需要的,通过聚集之后进行数据分析的表。

行式存储的适用场景:

  1、适合随机的增删改查操作;

  2、需要在行中选取所有属性的查询操作;

  3、需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。

列式存储的适用场景:

  一般来说,一个OLAP类型的查询可能需要访问几百万甚至几十亿个数据行,且该查询往往只关心少数几个数据列。例如,查询今年销量最高的前20个商品,这个查询只关心三个数据列:时间(date)、商品(item)以及销售量(sales amount)。商品的其他数据列,例如商品URL、商品描述、商品所属店铺,等等,对这个查询都是没有意义的。而列式数据库只需要读取存储着“时间、商品、销量”的数据列,而行式数据库需要读取所有的数据列。因此,列式数据库大大地提高了OLAP大数据量查询的效率。

  很多列式数据库还支持列族(column group,Bigtable系统中称为locality group),即将多个经常一起访问的数据列的各个值存放在一起。如果读取的数据列属于相同的列族,列式数据库可以从相同的地方一次性读取多个数据列的值,避免了多个数据列的合并。列族是一种行列混合存储模式,这种模式能够同时满足OLTP和OLAP的查询需求。

  实操中我们会发现,行式数据库在读取数据的时候,会存在一个固有的“缺陷”。比如,所选择查询的目标即使只涉及少数几项属性,但由于这些目标数据埋藏在各行数据单元中,而行单元往往又特别大,应用程序必须读取每一条完整的行记录,从而使得读取效率大大降低,对此,行式数据库给出的优化方案是加“索引”。

  在OLTP类型的应用中,通过索引机制或给表分区等手段,可以简化查询操作步骤,并提升查询效率。但针对海量数据背景的OLAP应用(例如分布式数据库、数据仓库等等),行式存储的数据库就有些“力不从心”了,行式数据库建立索引和物化视图,需要花费大量时间和资源,因此还是得不偿失,无法从根本上解决查询性能和维护成本等问题,也不适用于数据仓库等应用场景,所以后来出现了基于列式存储的数据库。对于数据仓库和分布式数据库来说,大部分情况下它会从各个数据源汇总数据,然后进行分析和反馈,其操作大多是围绕同一列属性的数据进行的,而当查询某属性的数据记录时,列式数据库只需返回与列属性相关的值,在大数据量查询场景中,列式数据库可在内存中高效组装各列的值,最终形成关系记录集,因此可以显著减少IO消耗,并降低查询响应时间,非常适合数据仓库和分布式的应用。

<span role="heading" aria-level="2">数据库行存储及列存储详解

 

<span role="heading" aria-level="2">数据库行存储及列存储详解       <span role="heading" aria-level="2">数据库行存储及列存储详解

5.总结

1.传统行式数据库的特性如下:

  ①数据是按行存储的。

  ②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。

  ③建立索引和物化视图需要花费大量的时间和资源。

  ④面对查询需求,数据库必须被大量膨胀才能满足需求。

2.列式数据库的特性如下:

  ①数据按列存储,即每一列单独存放。

  ②数据即索引。

  ③只访问查询涉及的列,可以大量降低系统I/O。

  ④每一列由一个线程来处理,即查询的并发处理性能高。

  ⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154548.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tomcat 日志概述[通俗易懂]

    Tomcat 日志概述[通俗易懂]1   Tomcat日志概述Tomcat日志信息分为两类:一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息。二是访问日志信息,它记录的访问的时间,IP,访问的资料等相关信息。2   Tomcat日志配置2.1 访问日志的配置默认tomcat不记录访问日志,如下方法可以使

    2022年6月20日
    27
  • Oracle新建索引、删除索引和查看索引

    Oracle新建索引、删除索引和查看索引1、创建索引createindex索引名on表名(列名);2、删除索引dropindex索引名;3、创建组合索引createindex索引名on表名(列名1,列名2,列名3,…);查看目标表中已添加的索引–在数据库中查找表名select*fromuser_tableswheretable_namelike‘tablename%’;–查看该表的所有索引select*fromall_indexeswheretable_name=‘tablen

    2022年9月4日
    3
  • pycharm不联网能运行吗_pycharm连接调试器失败

    pycharm不联网能运行吗_pycharm连接调试器失败第一步:查看你的计算机是否安装了严密的防火墙,当你开始运行编写的网络程序时他都会发出警告并且禁止你的程序连接网络你要对防火墙进行配置,让他允许你的程序或者直接关闭防火墙(慎重考虑)如下图直接关闭防火墙或者对防火墙进行设置(只要选中这两个勾,在你执行的时候会提示你是否允许XXX连接网络)第二步:因为有些代码里面可能需要根据主机名称来去本地的DNS里找对应的IP地址,由于本地的DN…

    2022年8月27日
    3
  • jstat使用_jvm常用命令

    jstat使用_jvm常用命令如何判断JVM是否存在内存问题呢?判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。Jstat是JDK自带的一个轻量级小工具。全称“JavaVirtualMachinestatisticsmonitoringtool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能…

    2022年9月12日
    0
  • html简单登录页面代码

    html简单登录页面代码图片必须是在Imges下的否则显示不出来(复制代码的话把图片换成你的图片就好了)代码如下&lt;html&gt;&lt;head&gt;&lt;title&gt;tes

    2022年6月13日
    58
  • 局域网组建与维护期末考试题_局域网聊天程序java报告

    局域网组建与维护期末考试题_局域网聊天程序java报告局域网的组建与维护》学科期中测试题2014年秋季学期13级《局域网的组建与维护》期中测试题班别_____________姓名_____________成绩________________一、填空题(每空2分,共20分)1、计算机网络按地理位置分,可分为广域网、城域网、_局域网___。2、网线制作中,若采用T568B标准,则8针配线线序依次是白橙、橙、白绿_____蓝、白蓝、绿、白棕、棕3、两头都采…

    2025年7月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号