小 T 导读:作为一款业余的时序数据库(Time Series Database,TSDB),为满足用户在不同场景下的查问需要,TDengine 提供了丰盛的查问性能。除了一些次要的查问外,还包含多表聚合查问、降采样查问及间断查问,本文将从实际操作层面对这三种非凡查问进行解读。
查问数据
次要查问性能
TDengine 采纳 SQL 作为查询语言,应用程序能够通过 REST API 或连接器发送 SQL 语句,用户还能够通过 TDengine 命令行工具 taos 手动执行 SQL 即席查问(Ad-Hoc Query)。TDengine 反对如下查问性能:
- 单列、多列数据查问
- 标签和数值的多种过滤条件:>, <, =, <>, like 等
- 聚合后果的分组(Group by)、排序(Order by)、束缚输入(Limit/Offset)
- 数值列及聚合后果的四则运算
- 工夫戳对齐的连贯查问(Join Query: 隐式连贯)操作
- 多种聚合 / 计算函数: count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff 等
例如:在命令行工具 taos 中,咱们须要从表 d1001 中查问出 voltage > 215 的记录,按工夫降序排列,仅仅输入如下 2 条后果。
taos> select * from d1001 where voltage > 215 order by ts desc limit 2;
ts | current | voltage | phase |
======================================================================================
2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 |
2018-10-03 14:38:15.000 | 12.60000 | 218 | 0.33000 |
Query OK, 2 row(s) in set (0.001100s)
为满足物联网场景的需要,TDengine 还反对几个非凡的函数,比方 twa(工夫加权均匀)、spread (最大值与最小值的差)、last_row(最初一条记录)等,将来还将有更多与物联网场景相干的函数增加进来。
多表聚合查问
在物联网场景中,往往同一个类型的数据采集点有多个。TDengine 采纳超级表 (STable) 的概念来形容某一个类型的数据采集点,一张一般的表来形容一个具体的数据采集点。同时 TDengine 应用标签来形容数据采集点的动态属性,一个具体的数据采集点有具体的标签值。
通过指定标签的过滤条件,TDengine 实现了将超级表 (某一类型的数据采集点) 所属的子表对立进行聚合查问。值得一提的是,对一般表的聚合函数以及绝大部分操作都实用于超级表,语法齐全一样。
示例一
在 TAOS Shell 查找加利福尼亚州所有智能电表采集的电压平均值,并依照 location 分组。代码如下所示:
taos> SELECT AVG(voltage) FROM meters GROUP BY location;
avg(voltage) | location |
=============================================================
222.000000000 | California.LosAngeles |
219.200000000 | California.SanFrancisco |
Query OK, 2 row(s) in set (0.002136s)
示例二
在 TAOS shell 查找 groupId 为 2 的所有智能电表过来 24 小时的记录条数,电流的最大值。代码如下所示:
taos> SELECT count(*), max(current) FROM meters where groupId = 2 and ts > now - 24h;
cunt(*) | max(current) |
==================================
5 | 13.4 |
Query OK, 1 row(s) in set (0.002136s)
须要留神的是,TDengine 仅答应对同属于一个超级表的表之间进行聚合查问,不同超级表之间的聚合查问并不反对。
降采样查问、插值
除了上述场景,在物联网场景中,咱们还常常须要通过降采样(down sampling)将采集的数据按时间段进行聚合。TDengine 提供了一个简便的关键词——interval(等距离窗口),让依照工夫窗口进行的查问操作变得极为简略。比方,对智能电表 d1001 采集的电流值按每 10 秒钟求和:
taos> SELECT sum(current) FROM d1001 INTERVAL(10s);
ts | sum(current) |
======================================================
2018-10-03 14:38:00.000 | 10.300000191 |
2018-10-03 14:38:10.000 | 24.900000572 |
Query OK, 2 row(s) in set (0.000883s)
同样,降采样操作也实用于超级表,比方将加利福尼亚州所有智能电表采集的电流值按每秒钟求和:
taos> SELECT SUM(current) FROM meters where location like "California%" INTERVAL(1s);
ts | sum(current) |
======================================================
2018-10-03 14:38:04.000 | 10.199999809 |
2018-10-03 14:38:05.000 | 32.900000572 |
2018-10-03 14:38:06.000 | 11.500000000 |
2018-10-03 14:38:15.000 | 12.600000381 |
2018-10-03 14:38:16.000 | 36.000000000 |
Query OK, 5 row(s) in set (0.001538s)
此外,降采样操作也反对工夫偏移,比方:将所有智能电表采集的电流值按每秒钟求和,但要求每个工夫窗口从 500 毫秒开始:
taos> SELECT SUM(current) FROM meters INTERVAL(1s, 500a);
ts | sum(current) |
======================================================
2018-10-03 14:38:04.500 | 11.189999809 |
2018-10-03 14:38:05.500 | 31.900000572 |
2018-10-03 14:38:06.500 | 11.600000000 |
2018-10-03 14:38:15.500 | 12.300000381 |
2018-10-03 14:38:16.500 | 35.000000000 |
Query OK, 5 row(s) in set (0.001521s)
家喻户晓,在物联网场景里每个数据采集点采集数据的工夫较难同步,但很多剖析算法 (比方 FFT) 须要把采集的数据严格依照工夫等距离地对齐,在很多零碎里,这须要利用本人写程序来解决,但应用 TDengine 的降采样操作这个需要便能轻松解决了。
如果一个工夫距离里没有采集的数据,TDengine 还提供插值计算的性能。
写在最初
时序数据的查问场景多种多样,从用户需要登程,TDengine 进行了一系列查问性能的设计和优化。本文具体介绍了 TDengine 中的几种简单查问性能,如果大家在实操中遇到问题,能够将本文当做执行手册进行查阅,对于还无奈解决的问题,还能够加小 T 微信,进入 TDengine 技术社区深刻交换。
想理解更多 TDengine Database 的具体细节,欢送大家在 GitHub 上查看相干源代码。