Я храню информацию о пользователе в продольной таблице, где каждый атрибут пользователя соответствует отдельной строке.Очевидно, что для каждого пользователя может быть несколько строк, поскольку данные являются продольными.
Я пытаюсь найти все пользовательские данные конкретного пользователя на основе предоставленного номера мобильного телефона.Я использую следующий запрос:
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 на основе данного номера мобильного телефона и соединяю его со столбцом значения, а затем хочу найти все строки, соответствующие этому user_id.
Я настроил DISTKEY для столбца user_id и SORTKEY для столбца отметки времени.
Эта таблица содержит около 2 миллиардов строк.
Сведения о кластере:
Свойства кластера :
- Тип кластера: один узел
- Тип узла: dc1.large
ЕмкостьПодробности :
- Текущий тип узла: dc1.large
- Процессор: 7 вычислительных блоков EC2 (2 виртуальных ядра) на узел
- Память: 15 ГБ наузел
- Платформа: 64-разрядная
Запрос с этой конфигурацией в настоящее время занимает 160 секундвыполнить.
Благодарим за любую помощь в оптимизации этого запроса и сокращении времени выполнения.