amazon-web-services - 优化 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 亿行。
集群详情如下:
集群属性:
- 集群类型:单节点
- 节点类型:dc1.large
容量详情:
- 当前节点类型:dc1.large
- CPU:每个节点 7 个 EC2 计算单元(2 个虚拟内核)
- 内存:每个节点 15GiB
- 平台:64位
使用此配置的查询当前需要 160 秒才能执行。
感谢您在优化此查询和减少运行时间方面的任何帮助。
解决方案
如果不了解表的内容或您想要实现的目标,就很难对查询提出改进建议。
它很可能很简单:
SELECT DISTINCT user_id
FROM user_details
WHERE value = <given mobile no>
在 Amazon Redshift 中优化查询的另一部分是明智地使用DISTKEY
和SORTKEY
. 再一次,在不知道数据及其使用方式的情况下很难推荐合适的值,但是这个查询将受益value
于SORTKEY
. (但这并不一定意味着它是所有表格使用的最佳选择。)
推荐阅读
- flutter - 如何在 Flutter 应用中监听和处理 POST 请求
- flutter - 即使我在 initState 中初始化变量,Dart 也会抛出 LateInitializationError
- android - ChipGroup中的芯片如何居中对齐?
- java - 如何使用 Java 删除 AppEngine 版本、服务或应用程序?
- docker - airflow.exceptions.SerializedDagNotFound --> Scheduler down?
- kubernetes - 将 Kubernetes ConfigMap 数据字段分离到单独的文件中
- php - 使用 Server to Server API 打开 SSL 和 PHP
- php - 将带有新键的数组推送到现有数组
- html - CSS 属性 Max-Width 功能混淆
- php - 如何将 CURLOPT_POSTFIELDS 用于带大括号的查询字符串?- PHP