流计算触发不稳定及数据错误覆盖

【TDengine 使用环境】
测试环境

【TDengine 版本】3.3.8.8 oss

【操作系统以及版本】linux

【部署方式】容器部署

【集群节点数】1

【集群副本数】1

【描述业务影响】流计算触发时间不稳定,计算结果有时会覆盖之前时间戳的计算结果

【问题复现路径/shan】向超表meas_pcs下写入新数据,记录子表更新时间戳; 看输出到普通表pcs_realtime_result的结果,记录时间戳。

【遇到的问题:问题现象及影响】

  1. 流计算触发后,在web端显示结果存在延迟。例如,10:03才刷新出触发当时时间戳为2026-02-06T09:54:45.318+08:00的计算结果。
  2. 流计算触发间隔时间不稳定,有时0.2s,有时1.9s。
  3. 流计算计算结果有时会被最新的计算结果覆盖。是web端的显示bug吗?
  4. 采用流计算中语句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

【报错完整截图】

  1. _tlocaltime 是触发时服务器的系统时间,可以认为和计算开始时间相近。
  2. 触发时间间隔不稳定:interval 触发是以数据时间为准,如果不是均匀写入,而是每隔几秒写入一批数据这种,就会导致触发时间间隔不稳定;
  3. 当以 _tlocatime / 1000000 为主键时,如果是每隔几秒写入一批数据的方式,就可能会导致两个窗口触发时间相同,那么后一个窗口的计算结果就会覆盖前一个的;
  4. 结果存在明显延迟:取决于计算语句的开销和系统负载,可以手动跑一次计算语句,看耗时多少,再查看当前机器的 CPU 负载,以判断这个延迟是否合理

补充:

从建流语句看,是希望每隔 1s 计算一次各子表最新 v 值的统计信息?可以考虑使用定时触发,它的触发频率会更加均匀。但要看这条计算语句要执行多久,如果执行时间超过 1s,肯定会跟不上触发速度,延迟越来越高。

目前是在不定时地一个一个手动添加数据,测试函数功能和性能。

网页上刷新出来的时间才是计算完成的时间吗?有直接记录计算结束时间的语句吗?

还不是写入一批数据的场景,应该不会两个窗口触发时间相同。具体操作过程是:

  1. 在2026-02-06T09:54:44.315+08:00在某一个子表添加了一个v值。
  2. 这次在大概8分钟之后,web端才刷新到数据“2026-02-06T09:54:45.318+08:00 600 3 200”。这个时候应该已经触发计算结束、窗口关闭了吧。
  3. 在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_HISTORYFILL_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查到,是什么原因呢?

正常情况应该不会有这么大的延迟。需要综合写入速率、当时的系统资源状况等来分析才行。

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。