我将用户详细信息存储在一个纵向表中,其中用户的每个属性对应于一个单独的行。每个用户显然可以有多行,因为数据是纵向的。
我正在尝试根据提供的手机号码查找特定用户的所有用户详细信息。我正在使用以下查询:
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亿行。
群集详细信息为:
集群属性:
容量详细信息:
具有此配置的查询当前需要160秒才能执行。
感谢您在优化此查询和减少运行时间方面的任何帮助。
答案 0 :(得分:1)
非常很难在不了解表内容或您要达到的目标的情况下提出对查询的改进建议。
它很可能像这样简单:
SELECT DISTINCT user_id
FROM user_details
WHERE value = <given mobile no>
在Amazon Redshift中优化查询的另一部分是明智地使用DISTKEY
和SORTKEY
。同样,在不知道数据及其使用方式的情况下,很难推荐合适的值,但是此查询将受益于value
作为SORTKEY
。 (但这并不一定意味着它是所有使用该表的最佳选择。)