2017-08-04 63 views
0

我已经构建了一个系统,其中数据从s3每隔几分钟(从kinesis firehose)加载到redshift中。然后我从该主表中获取数据并将其分成每个客户的表格。无法优化Redshift查询

主表有几亿行。

create table {$table} as select * from {$source_table} where customer_id = '{$customer_id} and time between {$start} and {$end}' 

我定义为键:

SORTKEY (customer_id, time) 
DISTKEY customer_id 

一切我已阅读表明,这将是构建我的表的最佳方式

创建子表与这样的查询做/查询但性能是绝对糟糕的。即使仅选择几行,构建子表也需要花费一分钟。

我是否错过了某些东西或者我只需要缩放群集?

+0

主表或子表上的那些DISTKEY和SORTKEYs?如果将查询作为SELECT而不是CREATE TABLE运行,那么需要多长时间才能执行? –

+0

SELECT和CREATE TABLE的性能几乎相同。 –

回答

1

如果你没有更好的密钥,你可能不得不考虑使用DISTSTYLE EVEN,保持相同的排序关键。

理想情况下,分发密钥应该是在连接中使用的值,并将您的数据在整个集群中均匀分布。通过使用customer_id作为分配密钥,然后使用该密钥进行过滤,就可以迫使所有工作仅在一个片上完成。

要在操作中查看此操作,请查看系统表。首先,找到一个例子查询:

SELECT * 
FROM stl_query 
WHERE userid > 1 
ORDER BY starttime DESC 
LIMIT 10; 

然后,看看bytes每片为您的每一步查询在svl_query_report

SELECT * 
FROM svl_query_report 
WHERE query = <your query id> 
ORDER BY query,segment,step,slice; 

有关设计最好的表结构有一个非常详细的指南看看我们的"Amazon Redshift Engineering’s Advanced Table Design Playbook"

+0

这是有道理的,我会尝试均匀分布,以提高性能。 –