【问题标题】:How does GreenPlum split data into different segments?GreenPlum 如何将数据拆分为不同的段?
【发布时间】:2019-11-06 10:34:28
【问题描述】:

我想问一下GreenPlum是用什么规则把它的表分成段的。

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

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

谢谢!

【问题讨论】:

    标签: greenplum


    【解决方案1】:

    两种不同的方式。

    1. 分发密钥

    例子:

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

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

    1. 随机

    例子:

    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 个段数据库都在同一个物理主机上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多