【问题标题】:Best way to pre-aggregate time-series data in postgres在 postgres 中预聚合时间序列数据的最佳方法
【发布时间】:2020-05-08 21:15:37
【问题描述】:

我有一个如下的已发送警报表:

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 

警报很少,我有大约 1 亿个 user_id。该表总共有约 5 亿条条目(过去 2 个月)。

我想查询每个用户在过去 X 小时/天/周/月内的 1000 万个用户 ID(保存在另一个表中)的警报。我不能使用任何外部时间序列数据库,只能在 postgres 中完成。

我尝试为每个用户保留每小时的存储桶。但是数据非常稀疏,以至于我的行太多(userIds*hours)。例如。从该表中获取过去 10 小时内 1000 万用户的警报计数需要很长时间。

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

【问题讨论】:

    标签: sql postgresql time-series rollup


    【解决方案1】:

    每个用户的警报并不多,因此(user_id) 上的索引就足够了。

    不过,你也不妨花点时间,所以我推荐(user_id, sent_at)。这涵盖了查询的 where 子句。 Postgres 仍然需要查找原始数据页面以检查数据的更改。

    【讨论】:

    • 戈登,感谢您的快速回复。我确实在 user_id 上有索引。我会尝试在其中添加sent_at。问题是我通过与另一个具有这些 user_ids 的表进行连接来一次查询 1000 万用户。我应该先汇总计数然后加入吗?还是先加入再聚合?
    • @Heisenberg 。 . .我认为您应该问另一个问题,并清楚您要优化的查询。您在评论中的内容在问题中并不清楚(您确实提到了 1000 万行,但目前还不清楚发生了什么)。也就是说,加入两个这样的表可能不需要一个小时。
    • 我已更改问题描述。也许现在它更有意义了。
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多