(1) 是否建议手动选择分布键
实际生产中,建议手动进行分布键选择。对于分布式数据库,分布键(hash类型)的选取对于数据库的性能影响还是比较大的,如果选取不当,可能会导致:
1. 数据倾斜,查询时出现部分DN节点的IO短板,从而影响整体查询性能。
2. 增加跨节点间的网络通信数据量
一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。
(2) 数据分布策略建议
1. 分布方式:
策略 | 描述 | 适用场景 |
Hash | 表数据通过hash方式散列到集群中的所有DN实例上。 | 数据量较大的事实表 |
Replication | 集群中每一个DN实例上都有一份全量表数据。 | 小表,维度表 |
· 复制表(Replication)方式将表中的全量数据在集群的每一个DN实例上保留一份。主要适用于记录集较小的表。这种存储方式的优点是每个DN上都有该表的全量数据,在join操作中可以避免数据重分布操作,从而减小网络开销,同时减少了plan segment(每个plan segment都会起对应的线程);缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表。
· 哈希(Hash)表将表中某一个或几个字段进行hash运算后,生成对应的hash值,根据DN实例与哈希值的映射关系获得该元组的目标存储位置。对于Hash分布表,在读/写数据时可以利用各个节点的IO资源,大大提升表的读/写速度。一般情况下大表定义为Hash表。
2. Hash 分布表的分布键建议选取原则:
· 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。
· 在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如,表tab1相关的部分查询中出现tab1的列col1存在常量的约束(例如col1=’000001’),那么就应当尽量不用col1做分布列。
· 在满足前两条原则的情况,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。




