Timescale Cloud:性能、规模、企业级

自托管产品

MST

简介

给定一个在离散状态之间切换的系统或值,聚合在每个状态中花费的时间量。例如,您可以使用 `compact_state_agg` 函数来跟踪系统在 `error`(错误)、`running`(运行中)或 `starting`(启动中)状态下花费了多少时间。

`compact_state_agg` 旨在处理相对较少的状态。对于状态在行之间大多不同的数据集,它的性能可能不佳。

如果您需要跟踪每个状态的进入和退出时间,请使用 `state_agg` 函数。如果您需要根据心跳信号跟踪系统的活跃性,请考虑使用 `heartbeat_agg` 函数。

相关超函数组
警告

此函数组包含一些实验性函数。实验性函数在未来的版本中可能会更改或删除。我们不建议在生产环境中使用它们。实验性函数标有“**实验性**”标签。

聚合器

compact_state_agg
实验性将状态数据聚合到状态聚合中以进行进一步分析

访问器

duration_in
实验性从状态聚合中计算在给定状态中花费的总时间
interpolated_duration_in
实验性从状态聚合中计算在给定状态中花费的总时间,并在时间桶边界处插值
into_values
实验性将状态聚合扩展为一组行,显示每个状态的持续时间

汇总器

rollup
实验性合并多个状态聚合
compact_state_agg(
ts TIMESTAMPTZ,
value {TEXT | BIGINT}
) RETURNS StateAgg

将包含状态数据的数据集聚合到状态聚合中,以跟踪在每个状态中花费的时间。

必需参数
名称类型描述
tsTIMESTAMPTZ与每个状态读取关联的时间戳
value`TEXT`、`BIGINT`该时间点的状态
返回值
类型描述
aggStateAgg存储每个状态总花费时间的对象
示例

创建状态聚合以跟踪某些设备的状态

SELECT toolkit_experimental.compact_state_agg(time, status) FROM devices;
duration_in(
agg StateAgg,
state {TEXT | BIGINT}
[, start TIMESTAMPTZ]
[, interval INTERVAL]
) RETURNS INTERVAL

给定一个状态聚合,计算在给定状态中花费的总时间。如果您需要在时间桶边界处插值缺失值,请使用 `interpolated_duration_in`

必需参数
名称类型描述
aggStateAgg使用 `compact_state_agg` 创建的状态聚合
state`TEXT`、`BIGINT`要查询的状态
可选参数
名称类型描述
startTIMESTAMPTZ如果指定,仅返回此时间之后在该状态中花费的时间。
intervalINTERVAL如果指定,仅返回从开始时间到间隔结束时在该状态中花费的时间。
返回值
类型描述
duration_inINTERVAL在给定状态中花费的时间。显示为 `days`(天)、`hh:mm:ss`(时:分:秒)或两者的组合形式。
示例

创建一个测试表,用于跟踪系统在 `starting`(启动中)、`running`(运行中)和 `error`(错误)状态之间切换的时间。查询该表以获取在 `running` 状态中花费的时间。

如果您希望以秒为单位查看结果,请从返回结果中 `EXTRACT`(提取)纪元(epoch)。

SET timezone TO 'UTC';
CREATE TABLE states(time TIMESTAMPTZ, state TEXT);
INSERT INTO states VALUES
('1-1-2020 10:00', 'starting'),
('1-1-2020 10:30', 'running'),
('1-3-2020 16:00', 'error'),
('1-3-2020 18:30', 'starting'),
('1-3-2020 19:30', 'running'),
('1-5-2020 12:00', 'stopping');
SELECT toolkit_experimental.duration_in(
toolkit_experimental.compact_state_agg(time, state),
'running'
) FROM states;
duration_in
---------------
3 days 22:00:00
interpolated_duration_in(
agg StateAgg,
state {TEXT | BIGINT},
start TIMESTAMPTZ,
interval INTERVAL
[, prev StateAgg]
) RETURNS DOUBLE PRECISION

计算在给定状态中的总持续时间。与 `duration_in` 不同,此函数可用于跨多个时间桶的多个状态聚合。时间桶边界处的任何缺失值都会从相邻的状态聚合中插值。

必需参数
名称类型描述
aggStateAgg使用 `compact_state_agg` 创建的状态聚合
state`TEXT`、`BIGINT`要查询的状态
startTIMESTAMPTZ要计算的时间间隔的开始
intervalINTERVAL要计算的时间间隔的长度
可选参数
名称类型描述
prevStateAgg前一个时间间隔的状态聚合,用于在 `start` 处插值。如果为 `NULL`,则 `aggregate` 中的第一个时间戳用作间隔的开始。
返回值
类型描述
interpolated_duration_inINTERVAL在查询状态中花费的总时间。显示为 `days`(天)、`hh:mm:ss`(时:分:秒)或两者的组合形式。
示例

创建一个测试表,用于跟踪系统在 `starting`(启动中)、`running`(运行中)和 `error`(错误)状态之间切换的时间。查询该表以获取在 `running` 状态中花费的时间。使用 `LAG` 和 `LEAD` 获取相邻聚合进行插值。如果您希望以秒为单位查看结果,请从返回结果中 `EXTRACT`(提取)纪元(epoch)。

SELECT
time,
toolkit_experimental.interpolated_duration_in(
agg,
'running',
time,
'1 day',
LAG(agg) OVER (ORDER BY time)
) FROM (
SELECT
time_bucket('1 day', time) as time,
toolkit_experimental.compact_state_agg(time, state) as agg
FROM
states
GROUP BY time_bucket('1 day', time)
) s;
time | interpolated_duration_in
------------------------+--------------------------
2020-01-01 00:00:00+00 | 13:30:00
2020-01-02 00:00:00+00 | 16:00:00
2020-01-03 00:00:00+00 | 04:30:00
2020-01-04 00:00:00+00 | 12:00:00
into_values(
agg StateAgg
) RETURNS (TEXT, INTERVAL)
into_int_values(
agg StateAgg
) RETURNS (INT, INTERVAL)

将状态聚合解包为一组包含两列的行,显示每个状态的持续时间。默认情况下,列名为 `state` 和 `duration`。您可以使用与重命名表相同的方法重命名它们。

必需参数
名称类型描述
aggStateAgg使用 `compact_state_agg` 创建的状态聚合
返回值
类型描述
state`TEXT`、`BIGINT`在状态聚合中找到的状态
durationINTERVAL在该状态中花费的总时间
示例

从表 `states_test` 创建一个状态聚合。时间列名为 `time`,`state` 列包含与系统不同状态对应的文本值。使用 `into_values` 显示状态聚合中的数据。

SELECT state, duration FROM toolkit_experimental.into_values(
(SELECT toolkit_experimental.compact_state_agg(time, state) FROM states_test)
);
state | duration
------+----------
ERROR | 00:00:03
OK | 00:01:46
START | 00:00:11
rollup(
agg StateAgg
) RETURNS StateAgg

将多个状态聚合合并为一个单一状态聚合。例如,您可以使用 `rollup` 将来自 15 分钟桶的状态聚合合并为每日桶。

必需参数
名称类型描述
aggStateAgg使用 `compact_state_agg` 创建的状态聚合
返回值
类型描述
aggStateAgg结合输入状态聚合的新状态聚合
示例

结合多个状态聚合并计算在 `START` 状态中花费的持续时间

WITH buckets AS (SELECT
time_bucket('1 minute', ts) as dt,
toolkit_experimental.compact_state_agg(ts, state) AS sa
FROM states_test
GROUP BY time_bucket('1 minute', ts))
SELECT toolkit_experimental.duration_in(
'START',
toolkit_experimental.rollup(buckets.sa)
)
FROM buckets;

关键词

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