【发布时间】:2019-11-06 10:34:28
【问题描述】:
我想问一下GreenPlum是用什么规则把它的表分成段的。
它是将数据均匀地分成段还是根据块大小?
或者取决于数据的其他特征。
谢谢!
【问题讨论】:
标签: greenplum
我想问一下GreenPlum是用什么规则把它的表分成段的。
它是将数据均匀地分成段还是根据块大小?
或者取决于数据的其他特征。
谢谢!
【问题讨论】:
标签: greenplum
两种不同的方式。
例子:
CREATE TABLE foo
(id int, bar text)
DISTRIBUTED BY (id);
这会将数据传播到 id 列。您应该选择将数据均匀分布在数据库中的一列或一组列。如果表非常大,并且您将它连接到另一个也非常大的表,您可能希望通过相同的键分布这两个表。
例子:
CREATE TABLE foo
(id int, bar text)
DISTRIBUTED RANDOMLY;
这以随机方式分布数据。将此用于小表或表没有自然键的情况。
您还可以使用隐藏列“gp_segment_id”查看分布情况。
select gp_segment_id, count(*) from foo group by gp_segment_id order by gp_segment_id;
gp_segment_id | count
---------------+-------
0 | 1654
1 | 1655
2 | 1665
3 | 1661
4 | 1682
5 | 1683
【讨论】:
distributed randomly 实际上并不是随机的,而是循环分配的误称,doc 说
如果您的分布键中有足够多的不同值,则您的数据是均匀分布的。主键或唯一键是很好的候选者。
如果您的分配键只有几个不同的值,则具有相同值的每一行最终都位于同一段中。这是一种分配不均的情况,一些部分必须完成所有工作,而另一些部分则处于空闲状态。
示例:如果您选择性别作为分布键,您(通常)会得到 2-3 个值:女性/男性/未知。让我们把其他可能的值放在一边。 在这种情况下,您有 2-3 个不同的值,并且 2-3 个不同的段数据库将保存所有行。最坏的情况:这 3 个段数据库都在同一个物理主机上。
【讨论】: