由于Greenplum是一个分布式数据库,所以建表时需要指定分布键,将数据平均分布到各个Segment上。
Greenplum有两种数据分布策略:
1)Hash分布。选择一个或多个列作为分布键,计算 hash 值,并通过 hash 值路由到特定的Segment节点上。如果不指定分布键,默认将第一个字段作为分布键。
2)随机分布。数据随机分散在每一个节点中,可以保证数据平均分布,但是在执行 SQL 的过程中,关联等操作都需要将数据重分布,性能较差。
选择法则:
1)尽量选择经常需要 JOIN 的列
当关联键和分布键均一致时,可以在 Segment 中完成 JOIN,不需要重分布或者广播小表。
当关联键和分布键不一致时,则需要重分布不一致的表或者广播小表,带来额外的开销。
2)尽量选择分布均匀的列或者多列
若选择的分布列值分布不均匀,则可能导致数据倾斜。某些 Segment 非常大(压力大),某些 Segment 非常小。根据木桶原理,时间消耗会卡在数据多的节点上。
3)尽量选择高并发查询的条件列(指该查询条件产生的中间结果集小的,如果中间结果集很大,那就让所有节点都来参与运算更好,因此不选)
如果数据经常被高并发的键值或离散查询,可以将查询条件的列作为分布列,这样不需要连接到所有的 Segment 去查,可以大大提高并发能力。
4)不要轻易使用随机分布
网友评论