GreenPlum 如何将数据拆分为不同的段?
Posted
技术标签:
【中文标题】GreenPlum 如何将数据拆分为不同的段?【英文标题】:How does GreenPlum split data into different segments? 【发布时间】:2019-11-06 10:34:28 【问题描述】:我想问一下GreenPlum是用什么规则把它的表分成段的。
它是将数据均匀地分成段还是根据块大小?
或者取决于数据的其他特征。
谢谢!
【问题讨论】:
【参考方案1】:两种不同的方式。
-
分发密钥
例子:
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
【讨论】:
你好,如果我是key分配,系统有5个段,这个怎么分配?均匀到 5 段?或将其打包成类似大小的块?如果在分发后增加了新的段,如果每个段有不同级别的存储空间怎么办?? 思考行。 ID=1 进入分段 1,ID=2 进入分段 2,依此类推。如果添加分段,则必须重新分配数据。 添加新段时,开头为空。您重新分配所有表,分配键获取新的段数并在所有段中重新分配数据。distributed randomly
实际上并不是随机的,而是循环分配的误称,doc 说【参考方案2】:
如果您的分布键中有足够多的不同值,则您的数据是均匀分布的。主键或唯一键是很好的候选者。
如果您的分配键只有几个不同的值,则具有相同值的每一行最终都位于同一段中。这是一种分配不均的情况,一些部分必须完成所有工作,而另一些部分则处于空闲状态。
示例:如果您选择性别作为分布键,您(通常)会得到 2-3 个值:女性/男性/未知。让我们把其他可能的值放在一边。 在这种情况下,您有 2-3 个不同的值,并且 2-3 个不同的段数据库将保存所有行。最坏的情况:这 3 个段数据库都在同一个物理主机上。
【讨论】:
以上是关于GreenPlum 如何将数据拆分为不同的段?的主要内容,如果未能解决你的问题,请参考以下文章