3

创建表时在分布上使用多列有好处吗?例如:

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_facts三个不同的表channelchart并分别demo使用channel_id和。chart_iddemo_id

具体来说,

  1. 我是否应该始终添加distribution并包括id(s)我用于加入的所有内容以提高效率?
  2. 如果是这样,这些顺序是否id(s)重要?
  3. 这在架构级别上是如何工作的?(可选的)

谢谢!

4

2 回答 2

2

这取决于您要对数据库进行多少分片,以及您希望在每个分区中分配多少记录,我的意思是,如果您在分配中添加多于一列,您会将更多数据分片到更多分区中。

这还取决于您是按模还是散列...

但是,在我看来,如果您有一个多列主键,并且您想按此主键进行分片,则可能具有按多列(主键中的所有列)分布的意义,否则您应该按单个列分片在大多数情况下就足够了。

于 2012-09-23T07:36:09.430 回答
0

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

在以下情况下将发生同位连接:

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

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

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

于 2021-07-25T22:44:44.823 回答