OpenGauss 之PartitionMap

本文详细解释了OpenGuass中如何从pg_partition系统表生成PartitionMap,涉及RangePartitionMap(基于范围的)、HashPartitionMap(基于哈希的)和ListPartitionMap(基于列表的)的构建过程,以及它们的初始化方法和数据结构.
一. 前言

​       本文主要是讲述OpenGuass中是如何将pg_partition系统表中的分区信息初始化成PartitionMap的。

二.  RangePartitionMap

​       在OpenGuass中,RangePartitionMap事实上是一个以boundary元素(保存着是每一个分区列的分区值)排序的RangeElement的数组,数组的每个元素为主要信息是partitionOid、partitionno和boundaries,boundaries是个常量数组,每个元素的值为每个分区列的分区值。

​       RangePartitionMap的初始化是在BuildRangePartitionMap中实现的,主要流程如下所示:

​// 入参partition_list为pg_partition表中的每行数据
​BuildRangePartitionMap(List* partition_list)
​    foreach (tuple_cell, partition_list) {
​        Datum datum = heap_getattr(...Anum_pg_partition_partitionno..)  // 获取partitionno
​        BuildRangeElement(&(range_eles[range_itr]), range_map, partitionno)  // 将partitionno和oid等信息组成成数组元素
​            untransformPartitionBoundary(elem->boundary)  // 将pg_partition的每一行元素切分成数组,数组就是所有分区列的分区边界值
​                foreach (cell, boundary) {     // 遍历每一个分区列的边界值
​                    elem->boundary[counter++] = makeConst(max_value->val.str) // 逐个将每个分区列的边界值保存起来
​                }
​        qsort(range_eles)  // 将数组按照boundary 下边界排序
​        memcpy_s(relation->partMap, range_map)   // partMap数据实际上是range_map,也就是一个RangeElement的数组
​    }

​   

  三. HashPartitionMap

​        HashPartitionMap 的Build过程与 RangePartitionMap 的Build过程流程几乎一样,只不过Hash分区表只支持单列进行哈希分区,因此boundary只需要1个元素即可。

四. ListPartitionMap

​       ListPartitionMap的Build过程其实也是和RangePartitionMap是一样的,但是ListPartition和RangePartitionMap一样是支持多列Partition的,因此ListPartitionMap的listElements记录着每一个分区的信息,ListPartElement中的PartitionKey中的Const **values 则记录着每一列分区值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值