CloudBerryDB | 第2期 | 行列混合存储引擎

CloudBerryDB | 第2期 | 行列混合存储引擎

CloudBerryDB(Greenplum的接棒者)的行列混合存储引擎PAX多种encoding/compress算法、MVCC、XLOG以及VACUUM(目前正在做),也支持统计信息和稀疏过滤,另外还支持向量化执行器。当然它的向量化执行器目前还为开源,据hashdata老师讲,PAX计划明年Q1开源。这里的统计信息大致指一个block里面的最大值和最小值等,可以通过此统计信息进行过滤,减少IO。需要注意,他这里的PAX并不是指业界的PAX行列混合存储方案。

1、架构

9968a229eabb9a3d6e179d20ac418fc0.png

它在存储上分为5层:Access Handler:和AM接口打交道,就是所谓的table am层;Table Layer:用于表级别的更新、删除、读和写,比如事务的处理等,上图最左边还有向量化并行接口,用于支持向量化并行扫描等;MicroPartition Layer:文件、Group级别的读、写、更新和删除,并且还有统计信息和filter的处理,这里的统计信息有Min/Max和布隆过滤信息,可以进一步减少IO;Column layer:内存中列信息的抽象,有一些转换都在这一层做;Filter layer:文件系统级别的读写等。

2、元数据

每个文件对应了一个PAX辅助表,这个辅助表是行存,通过这个行存辅助表就可以实现一些MVCC等功能。他有两个辅助表,第一个辅助表字段有:

06195c3a4664da9ef79826eee0f47156.png

第二个辅助表:
fast sequence 表:用做产生全局的 block name

3、MVCC

PAX的MVCC通过辅助表的MVCC+visimap完成,辅助表中的可见行代表了当前事务可见的文件。Visimap文件名为<blocknum>_<generation>_<tag>.visimap,blocknum为当前数据文件名;generation为当前visimap的代数,每个对该数据文件的删除,都会使得代数+1;tag为当前事务ID,该字段是为了保证visimap文件名的唯一性。

4、数据格式

PAX的数据格式衍生于ORC,我们首先先看下ORC的格式:

40c4dcbe73d11526497a6b9dfb467b0b.png

一个ORC文件根据大小(通常是HDFS块大象)按行分割成多个stripe,也就是一个stripe里面包含多条记录,这些记录按照列进行独立存储;poststript提供了解释文件的必要信息,包含footer和metadata的长度、压缩类型、文件版本等;file footer包含了文件层级、schema、行数和列统计信息等。

Stripe内部按照列进行存储,每列连续存储,它内部包括:

1)索引数据:row group index,默认10000行一个row group,指向metadata streams

2)行数据:按列存储的数据,包括metadata stream和stream

Stripe footer:包含该stripe的统计结果,包括max、min、count等信息

PAX的格式由datastream和metastream组成,统计信息独立存放,去掉了index data,只保留了部分种类的stream,重新涉及的列类型并且加入了对列的自定义attributes:

4f7bcff94b6350a419da81b3edcb6601.png

Datastream和metastream组成和orc区别较大,datastream中列数据和内存中column抽象是对应的,PAX中存在PORC和PORC_VEC两种格式,其中PORC格式是cloudberry执行器友好的存储格式,也就是对应普通执行器;PORC_VEC是对向量化执行器友好的存储格式,主要是减少转换。Metastream和datastream相对应。

列存具体长什么样,以及PORC_VEC格式是什么样,如何体现对向量化执行器友好的,有待开源后进行详细分析。

5、列

Column为列在内存中的结构,如下图所示,Columns映射磁盘数据,上面是cbdb的行执行器,下面是向量化执行器。Column1和column2从磁盘读到内存后,作为porc格式,若使用向量化执行器,则需要拷贝转换成batch去执行;若使用cbdb行执行器,则column1需要拷贝,column2不需要拷贝,column2是非固定列(变长字段竟然不需要拷贝?);column3和column4作为porc_vec格式在向量化引擎中不用拷贝,而在行执行器中column3需要拷贝,column4不需要拷贝。需要等开源出来后,看下他们各自的格式到底什么样,从而理解什么场景下拷贝,因为这个动作对性能影响非常大,尤其是变长字段。

b09a07b5cad5c06f711b280c80d80771.png

6、编码和压缩

eb369fc5b5917c82713bee6e56e1a86f.png

7、稀疏过滤

通过稀疏过滤可以快速跳过无关数据,从而加快查询响应,在列存在统计信息的情况下,默认会打开稀疏过滤。

7659b09dde72a9a3539082126c6c3f67.png

8、分区写入

指的不是数据库级别的分区,对于列来说,能选定min/max范围进行分文件写入:新产生的文件将存在于特定的min/max范围内;稀疏过滤效果会更好。

9、cluster

可以对表进行物理重排,以提高查询性能,目前支持两种算法:Z-Order:主要用于将多维数据映射到一维数据进行排序;Lexical:用于对多维数据进行排序。

10、PAX写入

694492dc28d53b5d103b0bb765e52cef.png

12、PAX读

20843321e23c7d0ac13f191176da9110.png

13、PAX删除

f75174cbc368e08cf17a7bf1b9df8cb5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzs87

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值