连续查询
本文介绍Lindorm时序引擎中的连续查询的概念以及相关功能。
连续查询的概念
连续查询ontinuous Queries,简称CQ)是时序引擎内部自动定期执行的时序查询。
在时序应用的场景下,对于依照时间推进顺序写入的实时数据,用户有时会希望每隔一段固定时间,就能够按照一定的查询条件对该时间范围内的时序数据做一次计算(例如:对该时间范围内的数据求一次聚合计算),并将计算结果另行保存下来。该应用场景示例如下所示:

连续查询所针对的便是此类应用场景。在时序引擎中,连续查询提供了一种简化的流计算能力,在时间窗口结束后对窗口内的数据进行计算。
使用连续查询
连续查询的管理
Lindorm时序引擎提供SQL能力用于管理数据库中的连续查询。
连续查询的创建
在指定的Database下创建一个连续查询。SQL语法可参见CREATE CONTINUOUS QUERY。
连续查询的删除
从指定的Database下删除一个已存在的连续查询。SQL语法可参见DROP CONTINUOUS QUERY。
连续查询信息的展示
查询已有的连续查询元数据。SQL语法可参见SHOW CONTINUOUS QUERIES。
连续查询的窗口调度
连续查询运用的是时序引擎节点本地的时间戳来确定何时执行计算,并以此为参照推移计算窗口。连续查询会在每一个时间窗口关闭后、下一个窗口开始的时候对前一窗口内的数据进行计算。例如,一个持续计算指定的窗口间隔为1小时的话,该连续查询会在每个小时开始的时候执行一次计算。在晚上20:00触发计算时,计算的数据所属时间范围是[19:00:00,20:00:00)
。
尽管连续查询会在其定义的时间间隔结束后立刻开始计算,但根据其查询计算内容的不同,计算的结果可能也需要花一些时间才能保存到目标表中。延时取决于查询内容以及实例的实时负载。
连续查询的结果精度取决于原始数据的有序性。当数据写入原始数据表时存在乱序的情况,即下一个窗口开始后仍然有上一窗口的数据零星写入。那么这部分数据并不会参与到上一窗口的计算中。
数据库删除时,所有属于该数据库的连续查询都会被直接删除。
连续查询的场景与示例
连续查询的常用场景
数据的长期保存与成本平衡
对于数据量较大的场景,存储成本会成为用户关心的问题。因此可以运用连续查询并结合数据库管理的TTL或冷数据归档能力对长期数据进行有选择的降成本。
通过连续查询提升查询性能
对于某些查询较大时间范围的降采样查询或者跨时间线的聚合查询,如果直接对原始数据进行查询,耗时可能会很高。此时可以通过连续查询将结果进行预计算,之后在需要的时候直接查询计算后的结果表,其性能可能会更好。对于查询吞吐也可以有效提升。
示例
下面这个示例,展示了如何通过连续查询加上数据库的TTL来实现对数据进行高效的长期存储。
比如用户原始数据量较大,可以保存最近一个月,降精度后可以保留几年的数据。下面这个示例中,原始数据采样周期为1秒,降采样到分钟粒度进行长期存储。
将原始数据保存在db_sensor_month中,保存周期为30天,创建数据库:
CREATE DATABASE db_sensor_month WITH (ttl=30);
创建另一个数据库用于长期保存持续计算后的数据,数据库创建如下:
CREATE DATABASE db_sensor_year WITH (ttl=365);
创建用于保存计算结果的表:
CREATE TABLE db_sensor_year.sensor ( device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity BIGINT);
创建连续查询(执行降采样计算)如下:
CREATE CONTINUOUS QUERY db_sensor_year.my_cq WITH (INTERVAL='1m') AS INSERT into db_sensor_year.sensor(time, temperature, humidity, device_id,region) SELECT time, mean(temperature) AS temperature, mean(humidity) humidity, device_id, region FROM db_sensor_month.sensor SAMPLE BY 60s;