数据仓库内容分享(三):行式存储VS列式存储

这篇具有很好参考价值的文章主要介绍了数据仓库内容分享(三):行式存储VS列式存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

行式存储

列式存储

行存储、列存储对比

数据写入对比

数据读取对比

代码模拟行存和列存

行式存储、列式存储的主流数据库

行式存储数据库

列式存储数据库

行列混存数据库


行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

行式存储

Row-based storage storesatable in a sequence of rows

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

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

列式存储

Column-based storage storesatable in a sequence of columns

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

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

简单来说 行式存储 的存储单位是行,列式存储 的基本单位是列。似乎有点听君一席话如听一席话的感觉吧,不要打我下面我们详细介绍。

行存储、列存储对比

数据写入对比

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

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

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

行式存储的优势是写操作。基于行存的数据,在写入、更新、删除时,只需要找到这一行进行一次操作即可。在读取方面,哪怕只想读取其中的一列都需要找到整行,再从整行中进行读取。

数据读取对比

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

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

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

  • 从数据的压缩以及更性能的读取来对比,列存储由于是同质性数据,可以针对性的进行数据压缩和查询性能提升。

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

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

列式存储的优势是读取。在写入、更新、删除时,需要找到多个列极端情况下是所有的列,要对多个列分别进行操作,写入的次数变得较多。在读取方面,列式存储非常的灵活,只需要找到要读取的某几个列即可。

代码模拟行存和列存

下面我们用简单的代码对行存储和列存储进行模拟。

模拟行存:

private static void rowBased() {
    Map<Integer , Map<String , Object>> rows = new HashMap<>();

    Map<String , Object> row1 = new HashMap<>();
    row1.put("id" , 1);
    row1.put("firstname" , "smith");
    row1.put("lastname" , "joe");
    row1.put("age" , 12);

    Map<String , Object> row2 = new HashMap<>();
    row2.put("id" , 2);
    row2.put("firstname" , "jones");
    row2.put("lastname" , "mary");
    row2.put("age" , 12);

    rows.put(1 , row1);
    rows.put(2 , row2);

    // 更新
    // 1. 找到行,更新
    Map<String, Object> targetRow = rows.get(1);
    targetRow.put("lastname" , "Lee");
    targetRow.put("firstname" , "DevX");
    targetRow.put("age" , 22);


    // 删除
    row1.remove(1);

    // 读取 lastname 是 mary 数据
    // 如果还想读取别的列,必须在找到这一行后再进行读取
    for (Map.Entry<Integer, Map<String, Object>> entry : rows.entrySet()) {
        Map<String, Object> row = entry.getValue();
        if ("mary".equals(row.get("lastname"))) {
            System.out.println(row);
            for (Map.Entry<String, Object> columns : row.entrySet()) {
                 if ("age".equals(columns.getKey())) {
                    System.out.println("age = " + columns.getValue());
                }
            }
        }
    }
}

模拟列存:

private static void columnBased() {

    // key 是 id value 是对应列的值
    Map<Integer , Integer> idColumns = new HashMap<>();
    idColumns.put(1 , 1);
    idColumns.put(2 , 2);

    Map<Integer , String> firstNameColumns = new HashMap<>();
    firstNameColumns.put(1 , "smith");
    firstNameColumns.put(2 , "jones");

    Map<Integer , String> lastNameColumns = new HashMap<>();
    lastNameColumns.put(1 , "joe");
    lastNameColumns.put(2 , "mary");

    Map<Integer , Integer> ageColumns = new HashMap<>();
    ageColumns.put(1 , 12);
    ageColumns.put(2 , 16);

    // 更新
    firstNameColumns.put(1 , "Lee");
    lastNameColumns.put(1 , "DevX");
    ageColumns.put(1 , 22);

    // 删除
    idColumns.remove(1);
    firstNameColumns.remove(1);
    lastNameColumns.remove(1);
    ageColumns.remove(1);

    // 基于列式存储可以并行的读取多个不同的列
    // 读取 lastname 是 mary 数据
    for (Object value : lastNameColumns.values()) {
        if ("mary".equals(value)) {
            System.out.println(value);
        }
    }

    // 读取 firstname 是 DevX 数据
    for (Object value : firstNameColumns.values()) {
        if ("DevX".equals(value)) {
            System.out.println(value);
        }
    }
}

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

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

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

Row-based Column-based
写入 每一行的所有字段都存在一起,优点:对数据进行插入和修改操作很方便 当一条新数据到来,每一列单独存储,缺点:插入和修改操作麻烦
查询 查询时即使只涉及某几列,所有数据也都会被读取;优点:适合随机查询;在整行的读取上,要优于列式存储;缺点:行式存储不适合扫描,这意味着要查询一个范围的数据 查询时只有涉及到的列会被读取;缺点:查询完成时,被查询的列要重新进行组装
寻道范围 读取数据的时候硬盘寻址范围很大 由于仅对需要的列进行查找,因此硬盘寻道范围小
索引 缺点:要加速查询的话需要建立索引,建立索引需要花费很多时间 优点:任何列都能作为索引(每一列单独存储,查询个别列的时候,可以仅读取需要的那几个列,相当于为每一列都建立了索引)
压缩 缺点:不利于压缩 把一列数据保存在一起,而一列的数据类型相同 ;优点:利于压缩
空间 按行存储,不利于压缩,压缩比较差,占空间大 列式存储的时候可以为每一列创建一个字典,存储的时候就仅存储数字编码即可,降低了存储空间需求
聚合 不利于聚合操作 按列存储,利于数据聚合操作
使用场景 OLTP(存储关系型数据,用于使用数据的时候需要经常用到数据之间的依赖关系的场景,即读取的时候需要整行数据或者整行中大部分列的数据,需要经常用到插入、修改操作) OLAP(分布式数据库和数据仓库,适合于对大量数据进行统计分析,列与列之间关联性不强,仅进行插入和读取操作的场景)

行式存储、列式存储的主流数据库

行式存储数据库

  • MySQL

  • Oracle

  • SQLServer

  • DB2

  • PostgreSQL

行式存储数据库一般都已 OLTP 见长。

列式存储数据库

  • Druid

  • Kudu

  • Clickhouse

  • StarRocks

  • Hbase

  • HP Vertica

  • EMC Greenplum

列式存储数据库一般都已 OLAP 见长。

行列混存数据库

  • Oracle 双模式架构

对于Oracle而言,如果开启了In-Memory选项的话,会提供双模式架构:

  • 行式模式:磁盘(数据文件)和高速缓存(buffer cache)中,能够快速访问记录中的所有列,适合DML,满足OLTP类型应用。

  • 列式模式:根据设置加载到In-Memory Area中,适合数据分析和聚合等操作,满足OLAP类型的查询需求。

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库

  • TiDB

  • Hologres

  • PolarDB

本文简单介绍了行存储和列存储,对于两种存储方式来说并没有孰优孰劣,只是擅长的方向不同而已。在实际系统中往往是两者配合使用。在做技术选型时,需要深入了解业务场景特点,进行模拟测试后,根据评测结果选择合适的技术。

行式存储数据库,数据仓库内容分享,大数据(Hadoop)内容分享,数据仓库,oracle,数据库文章来源地址https://www.toymoban.com/news/detail-836033.html

到了这里,关于数据仓库内容分享(三):行式存储VS列式存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文了解数据库vs数据仓库vs数据湖

    大家好,我是KD,一名10年以上大数据架构研发经验从业者,目前主要从事云原生大数据方向设计,擅长云原生技术、数据架构、数据平台构建、大数据组件性能调优 以下是本文目录: 什么是数据库? 为什么会有数据仓库? 拆解几个OLAP核心概念 大数据技术架构演进过程 什

    2024年01月23日
    浏览(60)
  • 数据仓库内容分享(十):CDC 技术

    目录 成为数据治理专家: CDC 技术 CDC 概述 CDC 技术应用场景 对比常见的开源 CDC 方案 Sqoop DataX Flink CDC Debezium Canal CDC 的全称是  Change Data Capture  (变更数据捕获) ,在广义的概念上,只要是能捕获数据变更的技术,我们都可以称之为 CDC 。目前通常描述的 CDC 技术主要面向数

    2024年02月20日
    浏览(35)
  • 数据仓库内容分享(四):滴滴大数据成本治理实践

    目录 01 滴滴大数据成本治理总体框架 1. 滴滴数据体系 2. 滴滴大数据资产管理平台 3. 滴滴大数据成本治理总体框架 02 Hadoop 成本治理实践 03 ES 成本治理实践 04 一些心得 在介绍滴滴成本治理之前,首先来简单介绍一下滴滴的数据体系。 最底层是以数据引擎为基础的数据存

    2024年02月20日
    浏览(44)
  • 数据仓库内容分享(十二):数仓和大数据的双向奔赴

    在 MapReduce 流行这些年之后,针对大数据集的 分布式批处理执行引擎 已经逐渐成熟。到现在(2017年)已经有比较成熟的基础设施可以在上千台机器上处理 PB 量级的数据。因此,针对这个量级的 基本数据处理问题 可以认为已经被解决,大家的注意力开始转到其他问题上: 完

    2024年02月22日
    浏览(42)
  • 架构设计内容分享(二百零一):什么是数据仓库的架构?企业数据仓库架构如何建设?

    目录 企业数据仓库架构 单层架构(直连) 两层数据架构(数据集市层) 三层架构(OLAP) 数据仓库数据库 1、采用传统关系型数据库,或经过功能扩展的MPP数据库 2、大数据平台架构:Hadoop+Hive 采集、收集、清洗和转换工具(ETL) 1、抽取 2、清洗 3、转化和加载 前端应用工具

    2024年02月21日
    浏览(49)
  • 分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比

    作者:深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展,经营决策者及监管机构对信息时效性的要求越来越高,科技部门面临诸多挑战。例如,不少金融机构使用数仓业务系统,为公司高层提供日常经营报表,同时支持监管报送等应用。该业务系统通常是

    2024年02月07日
    浏览(45)
  • Flink 内容分享(二十七):Hadoop vs Spark vs Flink——大数据框架比较

    大数据开发离不开各种框架,我们通过学习 Apache Hadoop、Spark 和 Flink 之间的特征比较,可以从侧面了解要学习的内容。众所周知,Hadoop vs Spark vs Flink是快速占领 IT 市场的三大大数据技术,大数据岗位几乎都是围绕它们展开。 本文,将详细介绍三种框架之间的区别。 Hadoop:为

    2024年02月01日
    浏览(69)
  • 数据仓库内容分享(十七):Doris实践分享:它做了哪些架构优化和场景优化?

    Apache Doris是一款开源的实时数据仓库,由百度旗下的技术团队开发。它具有高性能、高可靠性、易扩展等特点,能够满足大规模数据实时查询和分析的需求。目前,Apache Doris已经成为国内外众多企业的首选数据仓库解决方案,包括阿里巴巴、美团、京东、滴滴等知名企业。

    2024年02月21日
    浏览(55)
  • 使用Python的Requests和BeautifulSoup库来爬取新闻网站的新闻标题、发布时间、内容等信息,并将数据存储到数据库中

    BeautifulSoup是Python的一个HTML/XML解析库,用于从HTML或XML文件中提取数据。结合Python的requests库,可以实现网页爬取和数据提取。 以下是一个简单的使用BeautifulSoup和requests库实现爬虫的示例:   用requests库和BeautifulSoup4库,爬取校园新闻列表的时间、标题、链接、来源。

    2024年02月10日
    浏览(55)
  • 用Microsoft Access作为DBMS,建立数据库和数据表来实现对一个简易的英汉电子词典进行存储和管理,这个简易电子词典中的内容至少包括:英文单词名、词性、汉语释义

    已完善英语词典词典所有功能,酌情使用 酌情参考 本单元的作业,意在检测学生是否达到以下学习目标: (1)掌握JDBC数据库访问的基本步骤; (2)掌握利用JDBC建立数据库连接的方法; (3)掌握利用JDBC对数据库进行查询的方法; (4)掌握利用JDBC对数据库中的数据进行增、删、]改

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包