TimescaleDB refresh_lag未忽略新行:为何设置后数据仍被聚合?
问题
我在my_table和my_table_hourly表中原本无数据,执行了以下语句设置视图参数:
ALTER VIEW my_table SET ( timescaledb.refresh_lag = '30 days', timescaledb.refresh_interval = '15 minutes', timescaledb.max_interval_per_job = '1 week' );
随后插入一条新数据:
INSERT INTO my_table (schedule_time, id) VALUES('2023-12-12 17:00:00.000 +0100', 1);
执行刷新物化视图操作:
REFRESH MATERIALIZED view my_table_hourly
我预期refresh_lag会忽略30天内的新行,但该行仍被插入到聚合表my_table_hourly中,查询后发现存在这条数据。请问这是为何?我是否误解了refresh_lag的作用?
分析与解答
你确实误解了timescaledb.refresh_lag的作用,同时参数设置对象也有误:
refresh_lag是为连续物化视图的自动刷新任务设计的,作用是让自动刷新延迟处理最近指定时间段的数据,避免还可能被修改的最新数据被过早聚合,保证聚合结果的一致性。它对手动执行的REFRESH MATERIALIZED VIEW操作完全无效——手动刷新会直接处理所有符合视图定义的数据,不会受该参数限制。- 你错误地将这些刷新参数设置在了源表
my_table上,timescaledb.refresh_lag、timescaledb.refresh_interval这类参数应该绑定在**连续物化视图(即my_table_hourly)**上,而非源表。
要实现你预期的效果,需要:
- 将参数设置到
my_table_hourly上:
ALTER MATERIALIZED VIEW my_table_hourly SET ( timescaledb.refresh_lag = '30 days', timescaledb.refresh_interval = '15 minutes', timescaledb.max_interval_per_job = '1 week' );
- 依赖TimescaleDB的自动刷新任务来同步数据,而不是手动执行
REFRESH MATERIALIZED VIEW——手动刷新不会遵循refresh_lag规则。
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

