我已经构建了一个系统,每隔几分钟(从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
我读过的所有内容都表明这将是构建我的表/查询的最佳方式,但性能绝对可怕。即使只有几行可供选择,构建子表也需要一分钟。
我是否遗漏了某些内容或者我只是需要扩展群集?
答案 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"