更新时间:2024-05-20 GMT+08:00

分区表对导入操作的性能影响

GaussDB Kernel内核实现中,分区表数据的插入的处理过程相比非分区表增加分区路由部分的开销,因从整体上分区表场景的数据插入开销主要看成:(1)heap-insert基表插入、(2)partition-routing分区路由两个部分,如图1所示,其中heap基表插入解决tuple入库对应heap表的问题并且该部分普通表和分区表共用,而分区路由部分解决分区路由即tuple元组插入到对应partRel的问题,并且分区路由算法本身作为一级、二级分区共用,不同之处在于二级分区相比一级分区多一层路由操作,对路由算法为两次调用。

图1 普通表&分区表数据插入
因此对数据插入优化的侧重点如下:
  1. 分区表基表Heap表插入:
    1. 算子底噪优化
    2. heap数据插入
    3. 索引插入build优化(带索引)
  2. 分区表分区路由:
    1. 路由查找算法逻辑优化
    2. 路由底噪优化,包括分区表partRel句柄开启、新增的函数调用逻辑开销

    分区路由的性能主要通过大数据量的单条INSERT语句体现,UPDATE场景内部包含了查找对应要更新的元组进行DELETE操作然后再进行INSERT,因此不如单条INSERT语句场景直接。

不同分区类型的路由算法逻辑如表1所示:
表1 路由算法逻辑

分区方式

路由算法复杂度

实现概述说明

范围分区(Range Partition)

O(logN)

基于二分binary-search实现

间隔分区(Interval Partition)

O(logN)

基于二分binary-search实现

哈希分区(Hash-Partition)

O(1)

基于key-partOid哈希表实现

列表分区(List-Partition)

O(1)

基于key-partOid哈希表实现

二级分区(List/List)

O(1) + O(1)

哈希+哈希

二级分区(List/Range)

O(1) + O(1) = O(1)

哈希+二分查找

二级分区(List/Hash)

O(1) + O(1) = O(1)

哈希+哈希

二级分区(Range/List)

O(1) + O(1) = O(1)

二分查找+哈希

二级分区(Range/Range)

O(1) + O(1) = O(1)

二分查找+二分查找

二级分区(Range/Hash)

O(1) + O(1) = O(1)

二分查找+哈希

二级分区(Hash/List)

O(1) + O(1) = O(1)

哈希+哈希

二级分区(Hash/Range)

O(1) + O(1) = O(1)

哈希+二分查找

二级分区(Hash/Hash)

O(1) + O(1) = O(1)

哈希+哈希

分区路由的主要处理逻辑根据导入数据元组的分区键计算其所在分区的过程,相比非分区表这部分为额外增加的开销,这部分开销在最终数据导入上的具体性能损失和服务器CPU处理能力、表宽度、磁盘/内存的实际容量相关,通常可以粗略认为:
  • x86服务器场景下一级分区表相比普通表的导入性能会略低10%以内,二级分区表比普通表略低20%以内。
  • ARM服务器场景下为20%、30%,造成x86和ARM指向性能略微差异的主要原因是分区路由为in-memory计算强化场景,主流x86体系CPU在单核指令处理能力上略优于arm。