Лучший способ предварительно агрегировать данные временных рядов в postgres - PullRequest
0 голосов
/ 22 января 2020

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

id | user_id | sent_at
1  | 123     | 01/01/2020 12:09:39 
2  | 452     | 04/01/2020 02:39:50 
3  | 264     | 11/01/2020 05:09:39 
4  | 123     | 16/01/2020 11:09:39 
5  | 452     | 22/01/2020 16:09:39 

Оповещения редки, и у меня около 100 миллионов user_ids. Эта таблица содержит около 500 миллионов записей (за последние 2 месяца).

Я хочу запросить предупреждения для пользователя за последние X часов / дней / недель / месяцев для 10 миллионов users_ids (сохраненных в другой таблице). Я не могу использовать какую-либо внешнюю базу данных временных рядов, и это должно быть сделано только в postgres.

Я пытался хранить почасовые корзины для каждого пользователя. Но данные настолько скудны, что у меня слишком много строк (userIds * hours). Например, Получение оповещений для 10 миллионов пользователей за последние 10 часов занимает много времени из этой таблицы.

user_id | hour                | count
123     | 01/01/2020 12:00:00 | 2
123     | 01/01/2020 10:00:00 | 1
234     | 11/01/2020 12:00:00 | 1

1 Ответ

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

Количество предупреждений для каждого пользователя невелико, поэтому индекса на (user_id) должно быть достаточно.

Однако вы можете также указать время для него, поэтому я рекомендую (user_id, sent_at). Это охватывает предложение where вашего запроса. Postgres все равно придется искать исходные страницы данных, чтобы проверить изменения данных.

...