首页 > 解决方案 > 优化 AWS 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

'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 亿行。

集群详情如下:

集群属性

容量详情

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

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

标签: amazon-web-servicesamazon-redshift

解决方案


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

它很可能很简单:

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

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


推荐阅读