作为一款时序数据库(Time-Series Database),TDengine 提供了按工夫主动划分窗口并执行查问的能力。这个性能的用处和应用场景你是不是分明呢?本文将为你介绍这一性能及其典型应用场景。
什么是窗口查问?
时序数据经常须要依据采集工夫对数据进行查问,实质上是在时间轴上划分出工夫窗口,并对窗口内的数据进行聚合和查问计算。比方一个最简略的场景:查问”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″原始数据的最大值、最小值、平均值,则”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″就造成了一个查问的工夫窗口。
在理论生产利用中,业务场景要求的查问条件往往比这个更简单,须要时序数据库可能依照不同规定、沿时间轴进行窗口划分,并对各个窗口内的时序数据别离进行聚合、抉择计算等操作。
TDengine 提供的三种窗口查问能力详解
TDengine 从 2.2.x.x 版本起,反对了三类时序窗口查问,别离是等距离窗口(interval)、状态窗口(state_window)和会话窗口(session),大大简化了利用开发时对工夫序列逻辑的解决。
窗口查问,从子表的查问语法为:
SELECT function_list FROM tb_name [WHERE where_condition] [SESSION(ts_col, tol_val)][STATE_WINDOW(col)] [INTERVAL(interval [, offset]) [SLIDING sliding]] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
窗口查问,从超级表的查问语法为:
SELECT function_list FROM stb_name [WHERE where_condition] [INTERVAL(interval [, offset]) [SLIDING sliding]] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})] [GROUP BY tags]
上面别离看一下这三类时序窗口查问性能。
1. 等距离窗口(interval)
依照固定的工夫窗口长度,周期性地对时间轴进行窗口划分,并容许对每个窗口内的数据进行聚合查问。
咱们再通过几个例子看看等距离窗口的具体利用场景。
在工业生产中,有很多监控指标须要实时展现趋势线。但有些指标如振动等,理论采集的频率十分高,如果展现原始数据会难以看清趋势,同时因为数据量过于密集,会给前端页面的展现造成微小压力。
但通过 interval 等距离窗口,能够依照指定窗口长度对原始数据做聚合(相当于对原始数据进行了降采样),之后再展现趋势线时,前端展现须要从数据库拉取的数据量会大大减少,从而显著提高效率。
下图中,绿色曲线为基于每 60 秒采集一次的原始数据间接展现绘制的曲线,橙色曲线为对原始数据依照 5 分钟长度进行窗口划分后求取平均值的曲线,能够看到橙色曲线这种状况下,很好地反映了整体的数据变化趋势,而前端绘图所需的数据量却缩小了 80%。
在理论生产中高频采集数据的趋势线,均能够思考通过 TDengine 的 interval 语法提供的降采样能力,在不失落整体趋势信息的状况下,疾速展现数据。
2. 状态窗口(state_window)
状态窗口让用户能够依照某个整型 / 字符串型的采集量(个别是表征状态的值,如设施工作模式等)的值来划分窗口,将该状态值间断不变的记录划入同一个窗口。而后对每个窗口内的采集值进行 avg/max/min 等统计聚合、或计算状态持续时间等。
比方加工厂的机床运维人员,须要统计每个机床的工作和待机的工夫,这实质上是以工作状态“status”这个状态量的值来划分窗口,并统计窗口时长。
上图中“status”列,表征设施的当前工作状态,状态窗口对“status”值的间断变动状况进行判断,划分出三个窗口,并能够别离对每个窗口进行聚合,比方计算每个窗口内的开始工夫、完结工夫、总记录条数、平均值、窗口持续时间等。这些均可在 TDengine 中通过一条 SQL 查问语句间接实现,具体 SQL 语句和查问后果见下图。
3. 会话窗口(session)
在具体讨论会话窗口之前,咱们先看车联网平台的一个典型利用场景:通过车辆行驶数据对车辆行程进行划分。一部车从动员起步,到停车熄火的两头行驶过程视为一个残缺的“行程”。车辆在行驶时,车载 T-Box 个别会依照 30 秒的距离,向车联网平台发送本身的状态数据;而停车熄火时,则不再发送。因而,通过剖析车辆上报音讯的连续性,能够推算出该车辆的行程。
会话窗口让用户能够依照上报记录的工夫连续性来划分窗口,即相邻两条记录时间距离不超过某一阈值,则划归同一窗口;超过该阈值,则老窗口完结,新窗口开始;而后对每个窗口进行诸如持续时间等统计,或对窗口内的原始采集数据进行各种聚合计算,能够是 avg/max/min/count 或其余用户自定义函数。
会话窗口针对的场景是:让用户通过一条 SQL 语句实现按时序数据的“间断水平”来主动划分窗口。
如下图中的 SQL 所示,用户设置 session (ts, 10s),就是将相邻记录时间距离小于 10 秒的记录划分到同一个 session window 内;而对距离超过 10 秒的两条相邻记录则划分到不同窗口。这样就在下图中划分出了蓝色、红色、灰色标示出的 3 个窗口,每个窗口可独立计算窗口开始 / 完结工夫、窗口长度、窗口内记录数等用户感兴趣的统计量。
总结
时序数据除了数据量大、构造绝对简略的特点外,还在查问场景中大量波及工夫戳的解决。咱们往往要依据业务场景,按工夫戳对采集数据进行分组并计算。对于这类计算,如果开发者将原始数据读入内存,再由应用层程序去解决工夫窗口划分的逻辑,就不得不面对读取海量原始时序记录的磁盘 IO、CPU 及内存开销,同时业务层代码复杂度也变得更高。
如果开发者能够灵活运用 TDengine 这样的 Database 提供的时序数据窗口划分能力,联合业务场景,抉择适合的窗口划分函数来将相干计算负荷下沉到数据库层,则能大大晋升零碎响应性能、缩小负载开销,起到事倍功半的成果。
想理解更多 TDengine Database 的具体细节,欢送大家在 GitHub 上查看相干源代码。