Timescale Cloud:性能、扩展、企业级

自托管产品

MST

您的数据越多,就越有可能对其进行更复杂的分析。当简单的单层聚合不足时,Timescale Cloud 允许您在其他连续聚合之上创建连续聚合。通过这种方式,您可以在不同的粒度级别汇总数据,同时通过预计算节省资源。

例如,您可能有一个每小时连续聚合,用于汇总每分钟的数据。为了获得每日汇总,您可以在每小时聚合之上创建一个新的连续聚合。这比在原始超表之上创建每日聚合更高效,因为您可以重用每小时聚合中的计算结果。

此功能在 Timescale 2.9 及更高版本中可用。

在另一个连续聚合之上创建连续聚合与在超表之上创建它的方式相同。在您的查询中,从连续聚合而不是从超表中选择,并使用现有连续聚合中的时间分桶列作为您的时间列。

有关更多信息,请参阅创建连续聚合的说明。

在 TimescaleDB v2.13 及更高版本中,实时聚合默认**禁用**。在早期版本中,实时聚合默认**启用**;当您创建连续聚合时,对该视图的查询会包含最新原始数据的结果。

实时聚合总是返回最新的数据以响应查询。它们通过将连续聚合中的物化数据与源表或视图中的未物化原始数据连接来实现这一点。

当连续聚合堆叠时,每个连续聚合只知道紧邻下方的层。未物化数据的连接会递归进行,直到到达底层,从而让您访问到该层以下的最新数据。

如果您将堆栈中的所有连续聚合都保留为实时聚合,则底层是源超表。这意味着堆栈中的每个连续聚合都可以访问所有最新数据。

如果堆栈中存在非实时连续聚合,则递归连接会停止在该非实时连续聚合处。更高级别的连续聚合不会从较低级别接收任何未物化数据。

例如,假设您有以下连续聚合:

  • 源超表上的实时每小时连续聚合
  • 每小时连续聚合上的实时每日连续聚合
  • 每日连续聚合上的非实时(或仅物化)每月连续聚合
  • 每月连续聚合上的实时每年连续聚合

对每小时和每日连续聚合的查询包含来自源超表的实时、非物化数据。对每月连续聚合的查询仅返回已物化数据。对每年连续聚合的查询返回每年连续聚合本身的物化数据,以及来自每月连续聚合的最新数据。然而,这些数据仅限于每月连续聚合中已物化的数据,并且不会从源超表获取更新的数据。发生这种情况是因为仅物化的连续聚合提供了一个停止点,并且每年连续聚合不知道该停止点之外的任何层。这类似于PostgreSQL 中堆叠视图的工作方式

要使对每年连续聚合的查询访问所有最新数据,您可以选择:

  • 使每月连续聚合变为实时聚合,或者
  • 在每日连续聚合之上重新定义每年连续聚合。
Example of hierarchical continuous aggregates in a finance application

在汇总已汇总的数据时,请注意堆叠计算的工作方式。并非所有计算在堆叠时都能返回正确的结果。

例如,如果您取几个子集的最大值,然后取这些最大值的最大值,您将得到整个集合的最大值。但如果您取几个子集的平均值,然后取这些平均值的平均值,其结果可能与所有数据的平均值不同。

为了在使用连续聚合之上再使用连续聚合时简化此类计算,您可以使用 TimescaleDB Toolkit 中的超函数,例如统计聚合。这些超函数采用两步聚合模式设计,允许您将它们汇总到更大的桶中。第一步创建一个可以汇总的摘要聚合,就像最大值可以汇总一样。您可以将此聚合存储在连续聚合中。然后,在从连续聚合查询时,您可以将访问器函数作为第二步调用。此访问器从摘要聚合中获取存储的数据并返回最终结果。

例如,您可以使用 `percentile_agg` 在超表上创建每小时连续聚合,如下所示:

CREATE MATERIALIZED VIEW response_times_hourly
WITH (timescaledb.continuous)
AS SELECT
time_bucket('1 h'::interval, ts) as bucket,
api_id,
avg(response_time_ms),
percentile_agg(response_time_ms) as percentile_hourly
FROM response_times
GROUP BY 1, 2;

然后,要在此之上堆叠另一个每日连续聚合,您可以使用 `rollup` 函数,如下所示:

CREATE MATERIALIZED VIEW response_times_daily
WITH (timescaledb.continuous)
AS SELECT
time_bucket('1 d'::interval, bucket) as bucket_daily,
api_id,
mean(rollup(percentile_hourly)) as mean,
rollup(percentile_hourly) as percentile_daily
FROM response_times_hourly
GROUP BY 1, 2;

TimescaleDB Toolkit 的 `mean` 函数用于计算汇总值的具体平均值。额外的 `percentile_daily` 属性包含原始汇总值,这些值可以用于在此连续聚合之上(例如,用于每日值的连续聚合)的额外连续聚合中。

有关使用 `rollup` 函数堆叠计算的更多信息和示例,请参阅百分位数近似 API 文档

在另一个连续聚合之上创建连续聚合时存在一些限制。在大多数情况下,这些限制是为了确保有效的时间分桶。

  • 您只能在最终化的连续聚合之上创建连续聚合。此新的最终化格式是 Timescale 2.7 以来创建的所有连续聚合的默认格式。如果您需要在旧格式的连续聚合之上创建连续聚合,则需要先将您的连续聚合迁移到新格式。

  • 连续聚合的时间桶应大于或等于底层连续聚合的时间桶。它也需要是底层时间桶的倍数。例如,您可以将每小时连续聚合重新分桶为时间桶为 6 小时的新连续聚合。您不能将每小时连续聚合重新分桶为时间桶为 90 分钟的新连续聚合,因为 90 分钟不是 1 小时的倍数。

  • 无法在具有可变宽度时间桶的连续聚合之上创建具有固定宽度时间桶的连续聚合。固定宽度时间桶是以秒、分钟、小时和天定义的时间桶,因为这些时间间隔的长度总是相同的。可变宽度时间桶是以月或年定义的时间桶,因为这些时间间隔的长度因月份或闰年而异。此限制可防止出现例如尝试将每月桶重新分桶为 `61 天`桶的情况,因为在月份组合(例如七月/八月,62 天)的时间桶之间没有良好的映射关系。

    请注意,即使周是固定宽度的间隔,您也不能出于同样的原因在每周时间桶之上使用每月或每年时间桶。因为一个月或一年中的周数通常不是整数。

    然而,您可以在固定宽度时间桶之上堆叠可变宽度时间桶。例如,在每日连续聚合之上创建每月连续聚合是可行的,并且是此功能的主要用例之一。

关键词

在此页面上发现问题?报告问题 或在 GitHub 上编辑此页面