• GBase 8c 存储技术---列存储引擎(二)


    列存引擎

    传统行存储数据压缩率低,必须按行读取,即使读取一列也必须读取整行。在分析性的作业以及业务负载的情况下,数据库往往会遇到针对大量表的复杂查询,而这种复杂查询中往往仅涉及一个较宽(表列数较多)的表中个别列。此类场景下,行存储以行作为操作单位,会引入与业务目标数据无关的数据列的读取与缓存,造成了大量IO 的浪费,性能较差。因此openGauss提供了列存储引擎的相关功能。创建表的时候,可以指定行存储还是列存储。

    总体来说,列存储有以下优势:

    1. 列的数据特征比较相似,适合压缩,压缩比很高,在数据量较大(如数据仓库) 场景下会节省大量磁盘空间,同时也会提高单位作业下的IO 效率。
    2. 当表中列数比较多,但是访问的列数比较少时,列存储可以按需读取列数据,大大减少不必要的读IO,提高查询性能。
    3. 基于列批量数据向量运算,结合向量化执行引擎,CPU 的缓存命中率比较高,性能比较好,更适合 OLAP大数据统计分析的场景。
    4. 列存储表同样支持 DML操作和 MVCC,功能完备,且在使用角度上做了良好的兼容,基本是对用户透明的,方便使用。

    存储引擎的存储基本单位是 CU(Compression Unit,压缩单元),即表中一列的一部分数据组成的压缩数据块。行存储引擎中是以行作为单位来管理,而当使用列存储时,整个表整体按照不同列划分为若干个 CU,划分方式如下图所示。
    image.png

    为了管理表对应的CU,与执行器层进行对接来提供各种功能,列存储引擎使用了CUDesc(压缩单元描述符)表来记录一个列存储表中CU 对应的元信息。

    image.png

    注:Cmn表示第 m 列的、CUid是n(第n个)的压缩单元。每个 CU 对应一个 CUDesc的记录,在 CUDesc里记录了整个 CU 的事务时间戳信息、CU 的大小、存储位置、magic校验码、min/max等信息。

    与此同时,每张列存储表还配有一张 Delta表,Delta表自身为行存储表。当有少量的数据插入到一张列存储表时,数据会被暂时放入 Delta表,等到到达阈值或满足一定条件或操作时再行整合为 CU 文件。Delta表可以帮助避免单点数据操作带来的加重的 CU 操作与开销。

    设计采用级别的多版本并发控制,删除通过引入虚拟列映射 (Virtual Column Bitmap)来标记删除。映射(Bitmap)是多版本的。

    列存的索引
    列存储支持的索引:

    ● B tree索引
    ● 稀疏索引
    ● 聚簇索引

  • 相关阅读:
    6 java的基本数据类型和引用数据类型和基本数据类型的对象
    使用 C# 进行面向对象编程:第 9 部分
    【论文阅读】ConvNeXt:A ConvNet for the 2020s 新时代卷积网络
    错误:Some packages could not be installed.
    电脑c盘分区太小如何可以扩大,电脑c盘不够用了,如何给电脑分区
    Redis持久化(RDB和AOF)
    云南民族文化旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板
    Windows启用Hyper-V详细安装Centos7教程
    ABC344 A-E题解
    Argo CD快速入门教程(gitee+argo+k8s)
  • 原文地址:https://blog.csdn.net/qq_37004539/article/details/127568489