无法优化Redshift查询

时间:2017-08-04 13:46:37

标签: amazon-redshift

我已经构建了一个系统,每隔几分钟(从kinesis firehose)将数据从s3加载到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

我读过的所有内容都表明这将是构建我的表/查询的最佳方式,但性能绝对可怕。即使只有几行可供选择,构建子表也需要一分钟。

我是否遗漏了某些内容或者我只是需要扩展群集?

1 个答案:

答案 0 :(得分: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"