【TDengine 使用环境】
测试环境
【TDengine 版本】3.3.8.8 oss
【操作系统以及版本】linux
【部署方式】容器部署
【集群节点数】1
【集群副本数】1
【描述业务影响】流计算触发时间不稳定,计算结果有时会覆盖之前时间戳的计算结果
【问题复现路径/shan】向超表meas_pcs下写入新数据,记录子表更新时间戳; 看输出到普通表pcs_realtime_result的结果,记录时间戳。
【遇到的问题:问题现象及影响】
流计算触发后,在web端显示结果存在延迟。例如,10:03才刷新出触发当时时间戳为2026-02-06T09:54:45.318+08:00的计算结果。
流计算触发间隔时间不稳定,有时0.2s,有时1.9s。
流计算计算结果有时会被最新的计算结果覆盖。是web端的显示bug吗?
采用流计算中语句CAST(_tlocaltime/1000000 AS TIMESTAMP) AS ts,显示的是计算开始触发时还是计算完成时的当前时间?
完整创建流SQL语句如下:
CREATE STREAM energy_storage.stream_pcs_latest_sum
INTERVAL(1s) SLIDING(0)
FROM energy_storage.meas_pcs
STREAM_OPTIONS(
WATERMARK(3s) |
IGNORE_DISORDER |
FILL_HISTORY
)
INTO energy_storage.pcs_realtime_result
AS
SELECT
CAST(_tlocaltime/1000000 AS TIMESTAMP) AS ts,
SUM(latest_v) AS total_power,
COUNT(latest_v) AS device_count,
AVG(latest_v) AS avg_power
FROM (
– 获取每个子表最新的v值
SELECT
tbname,
LAST(v) AS latest_v
FROM energy_storage.meas_pcs
GROUP BY tbname
) AS device_latest;
【资源配置】16G 32C
【报错完整截图】
Kane
(邝金清)
2026 年2 月 6 日 06:55
2
_tlocaltime 是触发时服务器的系统时间,可以认为和计算开始时间相近。
触发时间间隔不稳定:interval 触发是以数据时间为准,如果不是均匀写入,而是每隔几秒写入一批数据这种,就会导致触发时间间隔不稳定;
当以 _tlocatime / 1000000 为主键时,如果是每隔几秒写入一批数据的方式,就可能会导致两个窗口触发时间相同,那么后一个窗口的计算结果就会覆盖前一个的;
结果存在明显延迟:取决于计算语句的开销和系统负载,可以手动跑一次计算语句,看耗时多少,再查看当前机器的 CPU 负载,以判断这个延迟是否合理
补充:
从建流语句看,是希望每隔 1s 计算一次各子表最新 v 值的统计信息?可以考虑使用定时触发,它的触发频率会更加均匀。但要看这条计算语句要执行多久,如果执行时间超过 1s,肯定会跟不上触发速度,延迟越来越高。
目前是在不定时地一个一个手动添加数据,测试函数功能和性能。
网页上刷新出来的时间才是计算完成的时间吗?有直接记录计算结束时间的语句吗?
还不是写入一批数据的场景,应该不会两个窗口触发时间相同。具体操作过程是:
在2026-02-06T09:54:44.315+08:00在某一个子表添加了一个v值。
这次在大概8分钟之后,web端才刷新到数据“2026-02-06T09:54:45.318+08:00 600 3 200”。这个时候应该已经触发计算结束、窗口关闭了吧。
在2026-02-06T10:42:27.486+08:00在某一个子表添加一个新的v值时,结果表中除了显示了最新的计算结果“2026-02-06T10:42:28.350+08:00 1000 3 333.33”,之前的计算结果也被覆盖成了“2026-02-06T09:54:45.318+08:00 1000 3 333.33”。
长时间不触发后第一次触发总会延迟很大,或者不触发,或者有bug,可能是什么原因呢?
您好,我又新建了流,修改成了定时触发PERIOD(5s),但是等了十几分钟发现它不会在流计算状态变成Running之后自动触发,直到我手动写入一次数据,才开始正常每5秒均匀触发。这又是什么原因呀?
CREATE STREAM energy_storage.stream_pcs_latest_sum
PERIOD(10s)
FROM energy_storage.meas_pcs
STREAM_OPTIONS(
IGNORE_DISORDER
)
INTO energy_storage.pcs_realtime_result
AS
SELECT
CAST(\_tlocaltime/1000000 AS TIMESTAMP) AS ts,
SUM(latest_v) AS total_power,
COUNT(latest_v) AS device_count,
AVG(latest_v) AS avg_power
FROM (
-- 获取每个子表最新的v值
SELECT
tbname,
LAST(v) AS latest_v
FROM energy_storage.meas_pcs
GROUP BY tbname
);
energy_storage.meas_pcs超表下的pcs_001、pcs_002、pcs_003的历史数据一直都存在,只是建流并running之后还没有最新数据添加,就不会触发吗?
只要流启动后,就会定时触发。因为没有指定FILL_HISTORY 和 FILL_HISTORY_FIRST,则不进行历史数据的触发计算。所以,即使触发了,因为没有结果,所以没有输出。
试过在stream_options中添加FILL_HISTORY或FILL_HISTORY_FIRST,出现报错:Internal error: `Fill history is not supported when trigger is period`;
还有报错Internal error: `FILL_HISTORY_FIRST and FILL_HISTORY cannot be used at the same time`
是的。 period 是不支持 历史数据的计算。因为是系统时间来驱动。
好的。interval触发是支持历史数据的计算的,但是从之前的尝试来看,从流计算触发、计算开始,到生成的结果数据写入结果表,会延迟5s-10min才能在web查到,是什么原因呢?
正常情况应该不会有这么大的延迟。需要综合写入速率、当时的系统资源状况等来分析才行。
system
(system)
关闭
2026 年3 月 26 日 03:25
14
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。