如果我在表中定义了大量数据,如
CREATE sensor_values ( ts TIMESTAMPTZ(35,6) NULL ),
值FLOAT8(17,17)默认的'NaN‘::REAL NULL,
sensor_id INT4(10)非空,);
每分钟都有数千点的数据。很多时候,虽然我需要提取和工作的日常价值,多年来(在一个网络前端)。为了帮助这一点,我想要一个sensor_values_days表,它只有每个点的每日和,然后我可以使用它来进行更长时间范围内更快的查询。
我不想每次写到数据库时都要触发,因为我担心这样会减缓写到数据库的瓶颈。
是否有一种只在插入了这么多行之后才触发的方法?或者是一个索引,并在几天内保持一个条目的总和的索引?我不认为那是可能的。
做这件事最好的方法是什么。它不必是非常最新的。失去最后几个小时或一天将不是一个问题。
谢谢
发布于 2021-03-19 04:49:53
什么是最好的方法来做到这一点。
安装clickhouse并使用AggregatingMergeTree表类型。
与postgres:
创建每个周期的汇总表。您可以有几个具有不同粒度的,比如小时、天和月份。
在每个时间段结束时运行一个cron或计划任务,再加几分钟。首先,在每个时间段表中选择最新的时间戳,这样您就知道从哪个时间段开始。然后,将主表中的所有行聚合到上次可用行之后的句点。如果每段时间表为空,或者如果错过了上次更新,则该过程也会正常工作。
为了只进行插入而不进行更新,您必须在每个时间段结束时运行它,以确保它得到了所有的数据。您还可以存储聚合行的第一个和最后一个时间戳,因此稍后如果检查表,它确实使用了期间的所有数据。
聚合后,“小时”表应该比“分钟”表小60倍,这会有帮助的!
然后,对“日”和“月”表重复相同的处理。
如果您想要最新的统计数据,您可以将“每日”表的所有结果(例如)与活动表的结果结合起来,但只能将当前的一天从活动表中提取出来,因为前几天的所有数据都已汇总到“每天”表中。希望今天的数据将被缓存在RAM中。
它不必是非常最新的。失去最后几个小时或一天将不是一个问题。
此外,如果您想要划分您的大表,确保您这样做,它的大小变得难以管理.
发布于 2021-03-19 04:28:34
物化视图和每5分钟一次的Cron可以帮助您:
https://wiki.postgresql.org/wiki/Incremental_View_Maintenance
在PG14中,我们将拥有增量物化视图,但目前正在发展中。
https://stackoverflow.com/questions/66707666
复制