南大通用GBase 8c分布式场景性能调优——选择表分布键

南大通用GBase 8c多模多态数据库的数据表支持两种分布类型,即复制表和分布表。在日常业务开发使用中,表的类型设计和分布键的使用选择对业务的查询性能影响很大,所以在业务开发阶段,表的结构设计尤其是分布表的分布键选择至关重要。
本文将从GBase 8c的一些优化实践中总结经验,讲述表分布键选择和优化的基本原则,希望对大家具有参考借鉴意义。
一、复制表和分布表概念
复制表
复制表是表中的全量数据在集群的每一个DN实例上保留一份。主要适用于记录集较小的表。
这种存储方式的优点是每个DN上都有该表的全量数据,在join操作中可以避免数据重分布操作,从而减小网络开销,同时减少了plan segment(每个plan segment都会起对应的线程);缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表,复制表不支持merge操作。
分布表
分布表是将表中某一个或几个字段进行hash运算后,生成对应的hash值,根据DN实例与哈希值的映射关系获得该元组的目标存储位置。
对于Hash分布表,在读/写数据时可以利用各个节点的I/O资源,大大提升表的读/写速度。一般情况下大表定义为Hash表,但分布表分布键不支持Update,需要业务实现delete后insert实现对分布键的update操作。
二、分布键的修改方法
复制表和分布表之间结构无法直接转换,需要导出DDL后,修改结构重建表。
GBase 8c分布表可以使用DDL修改在线修改分布键,但是会阻塞表访问。同时消耗较大的内存,数据量较小的情况可以使用,否则会失败。具体的语法如下:
alter table table_test distribute by hash(test_id);
该操作将table_test的分布键调整为test_id字段。
三、分布列选择原则和方法
GBase 8c在选择分布列时,建议遵循以下原则:
- 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列;
- 在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如,表abc相关的部分查询中出现表abc的列a存在常量的约束(例如a=‘000001’),那么尽量不用a做分布列;
- 在满足上述条件的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量;
- 尽量选择distinct值比较多的列,保证数据均匀分布;
- 尽量选择Join列或group 列做分布列。选择Join列或group by列是为了避免数据节点之间数据流动;
- 表分片列选择应避免DN间数据倾斜,可以通过如下SQL查看DN分片节点间数据倾斜情况
select xc_node_id, count(1) from tablename group by xc_node_id order by xc_node_id desc;
其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。
四、注意事项
- 在对复制表进行数据插入、修改、删除等操作时,如果用户使用声明为可下推(shippable或者immutable)的函数对不可下推的成分进行封装,则可能会导致复制表不同DN数据不一致。
- 使用带有窗口函数、rownum、limit子句、用户自定义函数等结果不稳定的语句对复制表进行数据插入或修改,可能会导致不同节点数据不完全相同。
评论


热门帖子
- 12023-05-09浏览数:16852
- 22019-04-26浏览数:10268
- 32020-05-11浏览数:10221
- 42023-09-25浏览数:9604
- 52023-07-04浏览数:9469