我有一张拥有约400M记录和100列的亚马逊红移表--80个维度和20个指标。
表由1个高基数维度列分布,并在sort键中包含几个高基数列。
一个简单的聚合查询:
Select dim1, dim2...dim60, sum(met1),...sum(met15)
From my table
Group by dim1...dim60
花了太长时间。解释计划看起来很简单,只是顺序扫描,而hashaggregate
就可以了。关于如何优化它的任何建议?
答案 0 :(得分:1)
顺序扫描非常正常。 Redshift不使用索引(它们本身就是大数据),而是使用并行集群,压缩和列式存储来提供快速查询。
通常,优化通过以下方式完成:
WHERE
语句中最常出现的字段,以快速跳过不包含相关数据的存储块。您的查询非常不寻常,因为您在表中所有行的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与-
之类的分隔符组合使用,并将其用作排序键