GreenPlum如何将数据拆分成不同的段?
How does GreenPlum split data into different segments?
请问GreenPlum 是根据什么规则将表分成段的。
它是将数据平均分成段还是根据块大小?
或取决于数据的其他特征。
谢谢!
两种不同的方式。
- 分发密钥
示例:
CREATE TABLE foo
(id int, bar text)
DISTRIBUTED BY (id);
这会将数据分布到 id 列。您应该选择一列或一组列,以便将数据均匀分布在整个数据库中。如果 table 非常大并且您将它连接到另一个也非常大的 table,您可能希望通过相同的密钥分发两个 table。
- 随机
示例:
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 个段数据库都在同一台物理主机上。
请问GreenPlum 是根据什么规则将表分成段的。
它是将数据平均分成段还是根据块大小?
或取决于数据的其他特征。
谢谢!
两种不同的方式。
- 分发密钥
示例:
CREATE TABLE foo
(id int, bar text)
DISTRIBUTED BY (id);
这会将数据分布到 id 列。您应该选择一列或一组列,以便将数据均匀分布在整个数据库中。如果 table 非常大并且您将它连接到另一个也非常大的 table,您可能希望通过相同的密钥分发两个 table。
- 随机
示例:
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 个段数据库都在同一台物理主机上。