暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 薛定谔的比干 2022-10-28
471

列存引擎

传统行存储数据压缩率低,必须按行读取,即使读取一列也必须读取整行。在分析性的作业以及业务负载的情况下,数据库往往会遇到针对大量表的复杂查询,而这种复杂查询中往往仅涉及一个较宽(表列数较多)的表中个别列。此类场景下,行存储以行作为操作单位,会引入与业务目标数据无关的数据列的读取与缓存,造成了大量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索引
● 稀疏索引
● 聚簇索引

最后修改时间:2022-10-28 11:32:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论