GreenPlum如何将数据拆分成不同的段?

How does GreenPlum split data into different segments?

请问GreenPlum 是根据什么规则将表分成段的。

它是将数据平均分成段还是根据块大小?

或取决于数据的其他特征。

谢谢!

两种不同的方式。

  1. 分发密钥

示例:

CREATE TABLE foo
(id int, bar text)
DISTRIBUTED BY (id);

这会将数据分布到 id 列。您应该选择一列或一组列,以便将数据均匀分布在整个数据库中。如果 table 非常大并且您将它连接到另一个也非常大的 table,您可能希望通过相同的密钥分发两个 table。

  1. 随机

示例:

CREATE TABLE foo
(id int, bar text)
DISTRIBUTED RANDOMLY;

这将以随机方式分发数据。将此用于小的 tables 或者如果 table.

没有自然键

您还可以使用隐藏列"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

如果您的分布键中有足够多的不同值,您的数据就会均匀分布。主键或唯一键是很好的选择。

如果您的分布键只有几个不同的值,则具有相同值的每一行最终都会出现在同一段中。这是一个不均匀的分布,一些部分必须完成所有工作而其他部分将闲置。

示例:如果您选择性别作为分配键,您(通常)最终会得到 2-3 个值:female/male/unknown。让我们把其他可能的值放在一边。 在这种情况下,您有 2-3 个不同的值,并且 2-3 个不同的段数据库将保存所有行。最坏情况:这 3 个段数据库都在同一台物理主机上。