Параллелизм для запроса выбора в Redshift - PullRequest
3 голосов
/ 20 января 2020

У нас есть таблица в Redshift:

people

people_id    people_tele      people_email        role
1            8989898332       john@gmail.com      manager
2            8989898333       steve@gmail.com     manager
3            8989898334       andrew@gmail.com    manager
4            8989898335       george@gmail.com    manager

У меня есть несколько пользователей, которые будут запрашивать таблицу как:

select * from people where role = 'manager' limit 1;

Системные пользователи в основном телефонные звонки этих людей для продажи продуктов. Таким образом, когда запрос возвращает результаты, он не должен возвращать одних и тех же людей.

Например.

Если пользователь A выполняет запрос - select * from people where role = 'manager' limit 1;, то он должен получить результат:

people_id    people_tele      people_email        role
1            8989898332       john@gmail.com      manager

Если пользователь B выполняет запрос - select * from people where role = 'manager' limit 1;, тогда он должен получить результат :

people_id    people_tele      people_email        role
2            8989898333       steve@gmail.com     manager

ПОДХОД 1

Итак, я подумал о добавлении столбца is_processed, чтобы не возвращать те же результаты. Таким образом, после того, как пользователь A выполнит запрос, таблица будет выглядеть примерно так:

people_id    people_tele      people_email        role         is_processed
1            8989898332       john@gmail.com      manager      1
2            8989898333       steve@gmail.com     manager      0
3            8989898334       andrew@gmail.com    manager      0
4            8989898335       george@gmail.com    manager      0

APPROACH 2

Другая идея заключалась в создании еще одной таблицы с именем - query_history где у меня есть:

query_id   people_id     processed_time
1          1             22 Jan 2020, 4pm
2          2             22 Jan 2020, 5pm

ВОПРОС

Мой вопрос заключается в том, что происходит, когда пользователь A и пользователь B запрашивают одновременно ТОЧНОЕ? В этот момент система будет возвращать один и тот же people_id, и одному и тому же человеку будет сделано 2 телефонных звонка.

Как решить проблему параллелизма?

Ответы [ 2 ]

4 голосов
/ 23 января 2020

Вы можете решить это с помощью вашего подхода 1, только добавив в него рандомизаторы

SELECT * FROM people 
WHERE role = 'manager' 
AND is_processed = 0
order by random()
limit 1;

См .: https://docs.aws.amazon.com/redshift/latest/dg/r_RANDOM.html

0 голосов
/ 23 января 2020

Может быть, вы можете решить с транзакциями? попробуйте выполнить попытку / поймать маневр.

Транзакция MySQL

edit: Извините, по некоторым причинам я подумал, что вы работаете с MySQL. https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-transaction-management.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...