Redshift:大量维度的聚合数据很慢

时间:2017-08-01 00:43:23

标签: amazon-web-services amazon-redshift

我有一张拥有约400M记录和100列的亚马逊红移表--80个维度和20个指标。

表由1个高基数维度列分布,并在sort键中包含几个高基数列。

一个简单的聚合查询:

Select dim1, dim2...dim60, sum(met1),...sum(met15)
From my table
Group by dim1...dim60 

花了太长时间。解释计划看起来很简单,只是顺序扫描,而hashaggregate就可以了。关于如何优化它的任何建议?

2 个答案:

答案 0 :(得分:1)

对于Amazon Redshift,

顺序扫描非常正常。 Redshift不使用索引(它们本身就是大数据),而是使用并行集群,压缩和列式存储来提供快速查询。

通常,优化通过以下方式完成:

  • DISTKEY:通常在最常用的列(或大多数GROUPed列)上用于本地化同一节点上的已连接数据。
  • SORTKEY:通常用于WHERE语句中最常出现的字段,以快速跳过不包含相关数据的存储块。
  • 压缩: Redshift会自动压缩数据,但随着时间的推移,数据的偏差可能会发生变化,从而使另一种压缩类型更加优化。

您的查询非常不寻常,因为您在表中所有行的60列上使用GROUP BY。这不是典型的数据仓库查询(行通常由WHERE限制,表由JOIN连接。)

我建议尝试使用较少的GROUP BY列,并通过WHERE子句将查询分解为几个较小的查询,以确定大多数时间占用的内容。最糟糕的情况是,您可以每晚运行结果并将其存储在一个表中以供以后查询。

答案 1 :(得分:1)

1)如果您的表格严重非规范化(您的80个维度实际上是20个维度,每个维度有4个属性),则仅按维度键分组更快,如果您确实需要所有维度属性,则加入聚合< / strong>返回维度表以获取它们,如下所示:

with 
groups as (
    select dim1_id,dim2_id,...,dim20_id,sum(met1),sum(met2)
    from my_table
    group by 1,2,...,20
)
select *
from groups
join dim1_table
using (dim1_id)
join dim2_table
using (dim2_id)
...
join dim20_table
using (dim20_id)

如果您不想对表进行规范化,并且您希望单行包含所有信息,则可以将其保留为原样,因为在列数据库中,如果不这样做,它们不会减慢查询速度使用它们。但是按80列分组肯定是低效的,并且必须在查询中进行“伪规范化”。

2)如果您的维度是分层的,则只能按最低级别进行分组,然后加入更高级别的维度属性。例如,如果您有国家,国家/地区和城市,每个属性有4个属性,则无需按12个属性进行分组,您只能按城市ID进行分组,然后将城市的属性,国家/地区和国家/地区表格加入城市ID每个小组

3)您可以在单独的varchar列中将维度ID与-之类的分隔符组合使用,并将其用作排序键