保持 table 与另一个同步,但具有累积/分组数据

Keep table synced with another but with accumulated / grouped data

如果我在 table 中有大量数据定义为

CREATE TABLE sensor_values ( ts TIMESTAMPTZ(35, 6) NOT NULL,
value FLOAT8(17, 17) DEFAULT 'NaN' :: REAL NOT NULL,
sensor_id INT4(10) NOT NULL, );

每分钟都有数千个点的数据。虽然我经常需要提取和处理多年来的每日价值(在网络前端)。为此,我想要一个 sensor_values_days table,它只有每个点的每日总和,然后我可以使用它在更长的时间跨度内进行更快的查询。

我不想每次写入数据库时​​都触发,因为我担心这会减慢已经瓶颈的数据库写入速度。

有没有插入这么多行才触发的方法? 或者也许是一个索引并维护几天内条目总和的索引?我不认为这是可能的。

执行此操作的最佳方法是什么。它不必是最新的。失去最后几个小时或一天都不是问题。

谢谢

物化视图和每 5 分钟一次的 Cron 可以帮助您:

https://wiki.postgresql.org/wiki/Incremental_View_Maintenance

在 PG14 中,我们将有增量物化视图,但目前正在开发中。

What would be the best way to do this.

安装 clickhouse 并使用 AggregatingMergeTree table 类型。

使用 postgres:

创建每期聚合 table。您可以有多个不同的粒度,例如小时、天和月。

在每个时间段结束时加几分钟进行 cron 或计划任务 运行。首先,select 每个周期 table 中的最新时间戳,因此您知道从哪个周期开始。然后,聚合主 table 中最后一个可用行之后的所有行。如果每个周期 table 为空,或者如果它错过了最后一次更新,那么它也会赶上。

为了只做插入而不做更新,你必须在每个周期结束时 运行 它,以确保它获得所有数据。您还可以存储聚合行的第一个和最后一个时间戳,因此稍后如果您检查 table,您会看到它确实使用了该期间的所有数据。

汇总后,“小时”table 应比“分钟”table 小 60 倍,这应该有所帮助!

然后,对“日”和“月”重复相同的过程table。

如果您想要最新的统计数据,您可以将“每天”table(例如)的所有结果与实时 table 的结果进行联合,但仅将当天从实时 table 中拉出,因为前几天的所有数据都已汇总到“每天”table 中。希望当天的数据将缓存在 RAM 中。

它不一定是最新的。失去最后几个小时或一天都不是问题。

此外,如果您想对巨大的 table 进行分区,请确保在其大小变得无法管理之前进行分区...