由多列分布

时间:2012-09-23 07:14:22

标签: postgresql

创建表时,在分发时使用多个列是否有好处?例如:

CREATE TABLE data_facts (
    data_id int primary key,
    channel_id smallint,
    chart_id smallint,
    demo_id smallint,
    value numeric)
DISTRIBUTED BY (
    channel_id,
    chart_id,
    demo_id)

因为我有可能需要使用data_factschannelchart加入demo三个不同的表channel_idchart_iddemo_id分别为distribution

具体地,

  1. 我是否应该始终添加id(s),并在效率方面包含我用于加入的所有id(s)
  2. 如果是这样,这些{{1}}的顺序是否重要?
  3. 这如何在架构级别上运行? (可选)
  4. 谢谢!

2 个答案:

答案 0 :(得分:2)

这取决于您希望 shard 数据库的数量,以及您希望在每个分区中分配的记录数量减少,我的意思是如果您在分发中添加多个列,您将分段将更多数据分成更多分区。

这也取决于你是通过modulo还是hash进行分片...

但是,在我看来,如果你有一个多列主键并且你希望通过这个主键进行分片可以有多个列分布(主键中包含所有列),否则你应该通过在大多数情况下足够的单列。

答案 1 :(得分:0)

没有。多个散列键不会带来好处,除非您进行散列分布并且单个键不能提供合理均匀的分布。

在以下条件下会发生同地连接:

  • 这是一个等值连接(key = key)
  • 连接中使用了所有分布列。

如果两个条件都不满足,其中一张表会在所有计算节点上广播,导致性能问题,偶尔查询失败。

使用分布的实用性与您的建模技术有很大关系。它在星型模式中比 3NF 结构更有效。在星型模式中,通常将事实分布在其最大维度表的键上。如果您加入该维度,就会发生托管。这会给您带来最大的好处,因为这将是最耗时的连接。通常,较小的维度表(在查询中)最终会被广播并保存在内存中以供连接使用。