优化AWS RedShift查询

时间:2018-11-22 05:56:24

标签: amazon-web-services amazon-redshift

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

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

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

“键”列对应于用户属性,“值”对应于该用户属性的值。

示例表是:

|---------|--------|------------|---------------------|
| 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,在时间戳列上设置了SORTKEY。

此表有近20亿行。

群集详细信息为:

集群属性

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

容量详细信息

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

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

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

1 个答案:

答案 0 :(得分:1)

非常很难在不了解表内容或您要达到的目标的情况下提出对查询的改进建议。

它很可能像这样简单:

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

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