TimescaleDB 中的复杂数据汇总

Complex Data Rollup in TimescaleDB

我有一个系统每 5 秒向 TimescaleDB 收集一次计数器数据。

汇总要求是:

  1. 对于超过 7 天的数据,粒度从 5 秒更改为 1 小时
  2. 对于超过 30 天的数据,粒度从 1 小时下降到 1 天

我可以通过使用来自 5s 超表的连续聚合并使用数据保留来得到 (1)。
但是,对于 (2),我无法从 (1) 的 1h 物化视图创建第二个物化视图,因为我只能从超表中创建它。

如何填写汇总要求?
我能否以某种方式利用我的测量值是计数器这一事实(可以简单地删除行以降低粒度)?

您可以在同一个超表上定义多个连续聚合,因此典型的方法是有一个单独的 5s、1h、1d 连续聚合,并在每个聚合上定义不同的数据保留策略。

Continuous aggregates 只能在超表之上定义。您不能从另一个定义连续聚合或更改它。

我看到两种方法可以使用当前版本的 TimescaleDB 2.2 实现所需的功能:

  1. 两个 continuous aggregate policies materializes data after 7 days. One retention policy 都在 1 周后删除原始数据,而另一个保留策略在 30 天后删除第一个具有 1 小时存储桶的连续聚合的数据。
  2. 第一个连续聚合政策在 7 天后实现,第二个 - 在 30 天后实现。这意味着需要保留原始数据,直到第二个连续聚合将数据具体化。因此,两种保留政策都将在 30 天之后生效。在原始数据保存更长时间的同时,超表可以 compressed 以减少磁盘使用。

这是可能的实现。 连续聚合在两种方法中都是相同的:

CREATE MATERIALIZED VIEW cagg_1h WITH (timescaledb.continuous) AS
SELECT time_bucket('1h', my_time_column), ...
FROM my_hypertable
WHERE ...
GROUP BY 1, ...;

CREATE MATERIALIZED VIEW cagg_1d WITH (timescaledb.continuous) AS
SELECT time_bucket('1d', my_time_column), ...
FROM my_hypertable
WHERE ...
GROUP BY 1, ...;

第一种方法的策略:

SELECT add_continuous_aggregate_policy('cagg_1h', INTERVAL '7d', INTERVAL '6d', INTERVAL '4h');
SELECT add_continuous_aggregate_policy('cagg_1d', INTERVAL '8d', INTERVAL '5d', INTERVAL '1h');
SELECT add_retention_policy('my_hypertable', INTERVAL '8d');
SELECT add_retention_policy('cagg_1h', INTERVAL '30d');

我尝试为连续聚合定义刷新windows,即开始和结束偏移间隔,以及保留原始数据的间隔,以便数据将在之前的两个连续聚合中具体化下降。

对于第二种方法:

SELECT add_continuous_aggregate_policy('cagg_1h', INTERVAL '7d', INTERVAL '6d', INTERVAL '4h');
SELECT add_continuous_aggregate_policy('cagg_1d', INTERVAL '30d', INTERVAL '27d', INTERVAL '1d');
SELECT add_compression_policy('my_hypetable', INTERVAL '7d');
SELECT add_retention_policy('my_hypertable', INTERVAL '30d');
SELECT add_retention_policy('cagg_1h', INTERVAL '30d');

同样,连续聚合包含刷新windows,因此数据将物化到所需的间隔,并且不会被保留策略删除。 第二种方法包括压缩策略,假设 7 天后没有更新到达原始数据,从问题描述来看似乎是正确的。

在添加压缩策略之前,有必要通过 altering the original hypertable 启用它。