【问题标题】:Unable to optimise Redshift query无法优化 Redshift 查询
【发布时间】:2017-08-04 13:46:36
【问题描述】:

我已经构建了一个系统,每隔几分钟(从 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

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

是我遗漏了什么还是只需要扩展集群?

【问题讨论】:

  • 那些DISTKEY和SORTKEY是在主表还是子表?如果您将查询作为 SELECT 而不是作为 CREATE TABLE 运行,那么执行需要多长时间?
  • SELECT 和 CREATE TABLE 的性能几乎相同。

标签: amazon-redshift


【解决方案1】:

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

理想情况下,分布键应该是一个在连接中使用的值,并将您的数据均匀地分布在整个集群中。通过使用customer_id 作为分发键,然后对该键进行过滤,您将强制所有工作仅在一个切片上完成。

要查看实际情况,请查看系统表。首先,找一个示例查询:

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

然后,查看svl_query_report 中查询的每个步骤的每个切片的bytes

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

有关设计最佳表格结构的详细指南,请查看我们的"Amazon Redshift Engineering’s Advanced Table Design Playbook"

【讨论】:

  • 这是有道理的,我将尝试使用均匀分布来提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2018-05-10
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多