优化 AWS RedShift 查询

Posted

技术标签:

【中文标题】优化 AWS RedShift 查询【英文标题】:Optimizing AWS RedShift query 【发布时间】:2018-11-22 05:56:24 【问题描述】:

我将用户详细信息存储在纵向表中,用户的每个属性对应于单独的行。由于数据是纵向的,因此每个用户显然可以有多行。

我正在尝试根据提供的手机号码查找特定用户的所有用户详细信息。我正在使用以下查询:

select ws.*
from (select * from user_details) as vs
inner join 
  (select distinct ms.user_id 
   from (select <given mobile no> as Phone) as ls
   inner join (select * from user_details) as ms on ls.Phone = ms.value
  ) as ws
on ws.user_id = vs.user_id

“key”列对应用户属性,“value”对应用户属性值。

示例表为:

|---------|--------|------------|---------------------|
| user_id |   key  |   value    |       timestamp     |
|---------|--------|------------|---------------------|
|  100    | mobile | 765783xxxx | 2018-09-09 13:40:00 |
|  100    |  email | abc@te.com | 2018-09-09 13:41:00 |
|  100    |  name  | johnny doe | 2018-09-09 13:42:00 |
|  101    | mobile | 456898xxxx | 2018-09-09 13:43:00 |
|  101    | email  | hi@som.org | 2018-09-09 13:44:00 |
|  101    |  name  | janey doe  | 2018-09-09 13:45:00 |
|---------|--------|------------|---------------------|

我首先根据给定的手机号码查找 user_id 并将其与 value 列连接,然后我想查找与该 user_id 对应的所有行。

我已经在 user_id 列上设置了 DISTKEY,在 timestamp 列上设置了 SORTKEY。

此表有近 20 亿行。

集群详情如下:

集群属性

集群类型:单节点 节点类型:dc1.large

容量详情

当前节点类型:dc1.large CPU:每个节点 7 个 EC2 计算单元(2 个虚拟内核) 内存:每个节点 15GiB 平台:64 位

使用此配置的查询当前需要 160 秒才能执行。

感谢您在优化此查询和减少运行时间方面的任何帮助。

【问题讨论】:

我认为该查询甚至不会运行。请发布您的实际查询,并通过在每行添加四个或更多空格将其格式化为代码。 为什么嵌套太多了?当嵌套工作过多时,计划总是会出错.. 您的查询看起来有点复杂,请您清楚地说明您的要求。如果您提供示例输入和预期输出会有所帮助 如果需要更多详细信息,请告诉我。 表的DISTKEYSORTKEY 是什么? 【参考方案1】:

如果不了解表的内容或您想要实现的目标,很难非常提出改进查询的建议。

它很可能很简单:

SELECT DISTINCT user_id
FROM user_details
WHERE value = <given mobile no>

在 Amazon Redshift 中优化查询的另一部分是明智地使用 DISTKEYSORTKEY。再一次,在不知道数据及其使用方式的情况下很难推荐合适的值,但此查询将受益于 valueSORTKEY。 (但这并不一定意味着它是所有表格使用的最佳选择。)

【讨论】:

+1- 试试这个(并根据您的要求量身定制),让我们知道速度。也请用你的表的 distkey 和 sortkey 更新你的问题。 此查询的执行时间相同。 它是否给出相同的结果集?如果是这样,可以通过将value 设置为SORTKEY 来优化此查询,但这可能会减慢使用timestamp 的其他查询。 @JohnRotenstein,timestampvalue 上的交错排序键会有帮助吗? 通常应避免使用交错排序键。他们需要很长时间才能通过VACUUM 创建,并且只在少数情况下提供好处。 (在这种情况下,仅当 timestampvalue 经常在单独查询中的 WHERE 语句中使用时。如果您经常通过电话号码进行用户查找,则可能值得仅使用 user+ 创建一个单独的表phone,可以针对此类查询进行优化。优点是查询速度非常快。缺点是需要使用此信息更新第二个表。

以上是关于优化 AWS RedShift 查询的主要内容,如果未能解决你的问题,请参考以下文章

AWS Redshift 查询过长异常

AWS Redshift 中的查询结果大小

AWS Redshift SQL 使用查询结果执行另一个查询

如何使用更改表查询在 AWS Redshift 中添加多列

AWS Quicksight,Redshift“引用嵌套表的子查询不能包含 WINDOW 操作”

AWS - Redshift 查询编辑器 v2 - 导出到 csv 超过 100 行