TimescaleDB 2.4.2版本实时连续聚合未自动更新问题咨询
问题根因
你遇到的现象是TimescaleDB连续聚合的默认设计导致的,和materialized_only参数无关:
- 连续聚合内部存在水线(watermark) 机制,所有低于水线的时间区间都被判定为「已完成物化」,查询时直接返回预先物化好的结果,不会再去原表查询这部分区间的新增/修改数据
- 只有时间戳高于水线的区间,才会触发实时查询原表和预物化结果的合并计算
- 你两次插入的数据都属于
2020-01-01这个时间桶,第一次创建连续聚合时这个桶就已经被纳入物化范围、低于水线,所以后续插入的150不会被实时聚合逻辑捕获,从你的查询计划也能验证这一点:实时查询原表的步骤直接排除了对应的chunk,返回0行结果。
解决方法
根据你的业务场景选择对应的方案:
- 如果你的业务只会写入/修改最近一段时间的历史数据(比如最近7天):
创建连续聚合的自动刷新策略,设置start_offset为你允许写入的历史时间范围,示例如下:
这样7天以内的区间都属于水线上方,写入的新数据会被实时聚合。SELECT add_continuous_aggregate_policy('data_daily', start_offset => INTERVAL '7 days', -- 水线维持在当前时间减7天的位置 end_offset => INTERVAL '1 hour', schedule_interval => INTERVAL '1 hour' ); - 如果你的业务需要任意历史区间的修改都能实时可见:
可以在每次写入历史数据后,手动调用refresh_continuous_aggregate刷新受影响的时间区间即可,不需要全量刷新:-- 只刷新2020-01-01当天的区间 CALL refresh_continuous_aggregate('data_daily', '2020-01-01', '2020-01-02'); - 也可以考虑升级TimescaleDB到2.7及以上版本,该版本对连续聚合的水线逻辑、实时聚合效率都做了优化。
内容的提问来源于stack exchange,提问作者Pasukaru
相关产品推荐
相关产品推荐

