选择分布列
Hash分布表的分布列选取至关重要,需要满足以下原则:
- 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。
- 在满足上述条件的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。
对于Hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。可以使用以下SQL检查数据倾斜性:
1 2 3 4 |
SELECT xc_node_id, count(1) FROM tablenameGROUP BY xc_node_id ORDER BY xc_node_id DESC; |
示例:
CREATE TABLE t1(c1 int) distribute by hash(c1); INSERT INTO t1 values(generate_series(1,100)); select xc_node_id, count(1) from t1 group by xc_node_id order by xc_node_id desc; DROP TABLE t1;
其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。
GaussDB支持多分布列特性,可以更好地满足数据分布的均匀性要求。
Range/List分布表的分布列由用户根据实际需要进行选择。除了需选择合适的分布列,还需要注意分布规则对数据分布的影响。