我想问一下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
如果您的分发密钥中有足够不同的值,则您的数据将平均分发。主键或唯一键是很好的选择。
如果您的分配键只有几个不同的值,则具有相同值的每一行都将位于同一段上。那是一个不均衡的分布,某些部分必须完成所有工作,而其他部分将处于闲置状态。
例如:如果您选择性别作为分配键,则通常会得到2-3个值:女性/男性/未知。让我们在这里撇开其他可能的值。在这种情况下,您有2-3个不同的值,并且2-3个不同的段数据库将保存所有行。最坏的情况:这3个段数据库都位于同一物理主机上。