如何在 timescaledb 中为历史数据设置连续聚合

how to setup continuous aggregation in timescaledb for historical data

我希望在新数据(无论是历史数据)出现时自动计算物化数据。

我的数据是用户手动添加的历史时间序列(使用应用程序但手动触发数据导入)。数据存储在提升为时间刻度的 table 中。每次用户以 100 毫秒的采样率(大约一小时的数据)添加大约 36000 行。第一个样本永远不会与一个小时的开始相关联,而且,以下数据部分也不会强制与前一部分相关联(可能存在间隙)。

我想要的是在 10 分钟、1 小时、1 天的桶中实现具体化数据,并且数据具体化过程应该 运行 自动进行。

我的第一个困惑是我是否应该在创建连续聚合后创建 continuous_aggregate_policy。目前我不这样做。当我插入数据的第一部分时(使用简单的 INSERT),我可以看到数据已成功具体化(我通过设置 timescaledb.materialized_only = true 进行了检查)。然后,当我添加了更多数据时,它并没有具体化。我找到了调度程序作业(只有一个作业)并尝试像 SELECT alter_job(1, next_start => now()); 一样重新安排它,但什么也没发生,数据仍然没有具体化(我看到 last_run_status 是成功的并且 last_successful_finish 更改为我 运行 查询的那一刻)。但是,hypertable_schemahypertable_name 字段是 NULL,所以我想知道这个后台作业是否会做任何事情。

如果我添加历史数据(比如 1 小时长的数据但 1 岁),添加 continuous_aggregate_policy 对我来说看起来不合逻辑。据我了解,continuous_aggregate_policy 仅更新最近的数据。

我是否应该选择在调用 CALL refresh_continuous_aggregate('conditions', '2020-01-01', '2020-02-01'); 添加数据后立即手动具体化数据?如果我在插入数据时不手动执行此操作,数据是否不会实现?在手动刷新的情况下,如果我的应用程序由于某种原因在提交新数据和调用连续聚合刷新查询之间失败,我担心可能出现数据不一致。在这种情况下,我可以在一个查询中同时执行这两项操作吗?如果这个查询失败会发生什么?我如何知道数据是否已提交?许多起义问题...

我项目的下一步将是自动化数据摄取,因此排除了与用户的交互和对该过程的监督。

那么,为手动添加的历史数据自动创建物化数据的正确策略是什么?

P.S。插入新数据后重新创建物化视图不是一种选择,因为它需要几天才能完成。

我假设 TimescaleDB 版本是 2.x。在 2.0 之前创建连续聚合视图总是创建相应的策略。 Changes in TimescaleDB 2.0.

中描述了这种变化和动机

有必要为每个连续聚合create continuous aggregate policies,否则不会自动将数据具体化为连续聚合。我不确定您最初是如何将数据放入连续聚合中的。

工作 1 是关于什么的?您可以查看 timescaledb_information.jobs 中的现有职位。 TimescaleDB 通常会创建一个用于遥测的作业,所以它可能就是它。

当您创建刷新连续聚合的策略时,请确保选择刷新 window,它将覆盖策略 运行 时新插入的数据。请参阅 start_offsetend_offset 参数。请注意,只有完全覆盖的桶才会被刷新。覆盖旧数据应该不是问题,因为 TimescaleDB 会跟踪由于新插入或更新的数据而导致的无效存储桶,并且不会刷新未发生更改的存储桶。