高效查詢數(shù)據(jù)
主要查詢功能
TDengine 采用 SQL 作為查詢語言。應用程序可以通過 C/C++, Java, Go, C#, Python, Node.js 連接器發(fā)送 SQL 語句,用戶可以通過 TDengine 提供的命令行(Command Line Interface, CLI)工具 TAOS Shell 手動執(zhí)行 SQL 即席查詢(Ad-Hoc Query)。TDengine 支持如下查詢功能:
- 單列、多列數(shù)據(jù)查詢
- 標簽和數(shù)值的多種過濾條件:>, <, =, <>, like 等
- 聚合結(jié)果的分組(Group by)、排序(Order by)、約束輸出(Limit/Offset)
- 數(shù)值列及聚合結(jié)果的四則運算
- 時間戳對齊的連接查詢(Join Query: 隱式連接)操作
- 多種聚合/計算函數(shù): count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff等
例如:在TAOS Shell中,從表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)
為滿足物聯(lián)網(wǎng)場景的需求,TDengine支持幾個特殊的函數(shù),比如twa(時間加權(quán)平均),spread (最大值與最小值的差),last_row(最后一條記錄)等,更多與物聯(lián)網(wǎng)場景相關(guān)的函數(shù)將添加進來。TDengine還支持連續(xù)查詢。
具體的查詢語法請看 TAOS SQL 的數(shù)據(jù)查詢 章節(jié)。
多表聚合查詢
物聯(lián)網(wǎng)場景中,往往同一個類型的數(shù)據(jù)采集點有多個。TDengine采用超級表(STable)的概念來描述某一個類型的數(shù)據(jù)采集點,一張普通的表來描述一個具體的數(shù)據(jù)采集點。同時TDengine使用標簽來描述數(shù)據(jù)采集點的靜態(tài)屬性,一個具體的數(shù)據(jù)采集點有具體的標簽值。通過指定標簽的過濾條件,TDengine提供了一高效的方法將超級表(某一類型的數(shù)據(jù)采集點)所屬的子表進行聚合查詢。對普通表的聚合函數(shù)以及絕大部分操作都適用于超級表,語法完全一樣。
示例1:在TAOS Shell,查找北京所有智能電表采集的電壓平均值,并按照location分組
taos> SELECT AVG(voltage) FROM meters GROUP BY location;
avg(voltage) | location |
=============================================================
222.000000000 | Beijing.Haidian |
219.200000000 | Beijing.Chaoyang |
Query OK, 2 row(s) in set (0.002136s)
示例2:在TAOS shell, 查找groupId為2的所有智能電表過去24小時的記錄條數(shù),電流的最大值
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僅容許對屬于同一個超級表的表之間進行聚合查詢,不同超級表之間的聚合查詢不支持。在 TAOS SQL 的數(shù)據(jù)查詢 一章,查詢類操作都會注明是否支持超級表。
降采樣查詢、插值
物聯(lián)網(wǎng)場景里,經(jīng)常需要通過降采樣(down sampling)將采集的數(shù)據(jù)按時間段進行聚合。TDengine 提供了一個簡便的關(guān)鍵詞 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 "Beijing%" 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)
物聯(lián)網(wǎng)場景里,每個數(shù)據(jù)采集點采集數(shù)據(jù)的時間是難同步的,但很多分析算法(比如FFT)需要把采集的數(shù)據(jù)嚴格按照時間等間隔的對齊,在很多系統(tǒng)里,需要應用自己寫程序來處理,但使用TDengine的降采樣操作就輕松解決。如果一個時間間隔里,沒有采集的數(shù)據(jù),TDengine還提供插值計算的功能。
語法規(guī)則細節(jié)請見 TAOS SQL 的時間維度聚合 章節(jié)。

