Оптимизация запроса AWS RedShift - PullRequest
0 голосов
/ 22 ноября 2018

Я храню информацию о пользователе в продольной таблице, где каждый атрибут пользователя соответствует отдельной строке.Очевидно, что для каждого пользователя может быть несколько строк, поскольку данные являются продольными.

Я пытаюсь найти все пользовательские данные конкретного пользователя на основе предоставленного номера мобильного телефона.Я использую следующий запрос:

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 секундвыполнить.

Благодарим за любую помощь в оптимизации этого запроса и сокращении времени выполнения.

1 Ответ

0 голосов
/ 22 ноября 2018

очень трудно предложить улучшения для запроса, не понимая ни содержимого таблицы, ни того, чего вы пытаетесь достичь.

Вполне возможно, что это может быть так простоas:

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

Другая часть оптимизации запроса в Amazon Redshift заключается в разумном использовании DISTKEY и SORTKEY.Еще раз, трудно рекомендовать подходящие значения, не зная данных и того, как они используются, но этот запрос выиграл бы от value, являющегося SORTKEY.(Но это не обязательно означает, что это лучший выбор для всего использования таблицы.)

...