TDengine的连续查询采用时间驱动模式,可以直接使用TAOS SQL进行定义,不需要额外的操作。 使用连续查询,可以方便快捷地按照时间窗口生成结果,从而对原始采集数据进行降采样(down sampling)。 用户通过TAOS SQL定义连续查询以后,TDengine自动在最后的一个完整的时间周期末端拉起查询, 并将计算获得的结果推送给用户或者写回TDengine。

    TDengine提供的连续查询与普通流计算中的时间窗口计算具有以下区别:

    • 如果有历史记录写入到已经计算完成的时间区间,连续查询并不会重新进行计算, 也不会重新将结果推送给用户。对于写回TDengine的模式,也不会更新已经存在的计算结果。
    • 使用连续查询推送结果的模式,服务端并不缓存客户端计算状态,也不提供Exactly-Once的语意保证。 如果用户的应用端崩溃,再次拉起的连续查询将只会从再次拉起的时间开始重新计算最近的一个完整的时间窗口。 如果使用写回模式,TDengine可确保数据写回的有效性和连续性。

    下面以智能电表场景为例介绍连续查询的具体使用方法。假设我们通过下列SQL语句创建了超级表和子表:

      每次执行这条语句,都会重新计算所有数据。 如果需要每隔30秒执行一次来增量计算最近一分钟的数据, 可以把上面的语句改进成下面的样子,每次使用不同的 startTime 并定期执行:

      这样做没有问题,但TDengine提供了更简单的方法, 只要在最初的查询语句前面加上 create table {tableName} as 就可以了, 例如:

      会自动创建一个名为 avg_vol 的新表,然后每隔30秒,TDengine会增量执行 as 后面的 SQL 语句, 并将查询结果写入这个表中,用户程序后续只要从 中查询数据即可。 例如:

      此外,TDengine还支持用户指定连续查询的起止时间。 如果不输入开始时间,连续查询将从第一条原始数据所在的时间窗口开始; 如果没有输入结束时间,连续查询将永久运行; 如果用户指定了结束时间,连续查询在系统时间达到指定的时间以后停止运行。 比如使用下面的SQL创建的连续查询将运行一小时,之后会自动停止。

      1. create table avg_vol as select avg(voltage) from meters where ts > now and ts <= now + 1h interval(1m) sliding(30s);

      需要说明的是,上面例子中的 now 是指创建连续查询的时间,而不是查询执行的时间,否则,查询就无法自动停止了。 另外,为了尽量避免原始数据延迟写入导致的问题,TDengine中连续查询的计算有一定的延迟。 也就是说,一个时间窗口过去后,TDengine并不会立即计算这个窗口的数据, 所以要稍等一会(一般不会超过1分钟)才能查到计算结果。

      管理连续查询

      用户可在控制台中通过 命令来查看系统中全部运行的连续查询, 并可以通过 kill stream 命令杀掉对应的连续查询。 后续版本会提供更细粒度和便捷的连续查询管理命令。