共计 4059 个字符,预计需要花费 11 分钟才能阅读完成。
小 T 导读:只管时序数据处理的特点是以写操作为主,读操作为辅,但查问需要也不容忽视。为不便用户上手,时序数据库(Time Series Database)TDengine 采纳 SQL 作为查询语言,次要查问性能包含单列及多列数据查问、数值列及聚合后果的四则运算、工夫戳对齐的连贯查问操作等,本文将就局部查问细则做剖析。
在《查问性能:TDengine 最高达到了 InfluxDB 的 37 倍、TimescaleDB 的 28.6 倍》中,咱们理解到了 TDengine 在查问方面展现出的具体实力。但想要更好地施展出 TDengine 的查问性能,在实际操作上,也还有一些事项须要留神,局部内容汇总如下:
TDengine SQL 查问语句能够指定局部或全部列作为返回后果。数据列和标签列都能够呈现在列表中。
通配符和标签列
通配符 * 能够用于代指全部列。对于一般表和子表,后果中只有一般列。对于超级表,还蕴含了 Tag 列。
SELECT * FROM d1001;
通配符反对表名前缀,以下两个 SQL 语句均为返回全副的列:
SELECT * FROM d1001;
SELECT d1001.* FROM d1001;
在 JOIN 查问中,带表名前缀的 和不带前缀 返回的后果有差异,* 返回全副表的所有列数据(不蕴含标签),而带表名前缀的通配符,则只返回该表的列数据。
SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;
下面的查问语句中,前者返回 d1001 和 d1003 的全部列,而后者仅返回 d1001 的全部列。
在应用 SQL 函数来进行查问的过程中,局部 SQL 函数反对通配符操作。其中的区别在于:count(*)函数只返回一列。first、last、last_row 函数则是返回全部列。
此外,在超级表和子表的查问中咱们也能够指定标签列,且标签列的值会与一般列的数据一起返回。
SELECT location, groupid, current FROM d1001 LIMIT 2;
后果去重
DISTINCT 关键字能够对后果集中的一列或多列进行去重,去除的列既能够是标签列也能够是数据列。
对标签列去重:
SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;
对数据列去重:
SELECT DISTINCT col_name [, col_name ...] FROM tb_name;
须要留神:
- cfg 文件中的配置参数 maxNumOfDistinctRes 将对 DISTINCT 可能输入的数据行数进行限度。其最小值是 100000,最大值是 100000000,默认值是 10000000。如果理论计算结果超出了这个限度,那么会仅输入这个数量范畴内的局部。
- 因为浮点数人造的精度机制起因,在特定状况下,对 FLOAT 和 DOUBLE 列应用 DISTINCT 并不能保障输入值的齐全唯一性。
非凡性能
局部非凡的查问性能能够不应用 FROM 子句执行。
上面的命令能够获取以后所在的数据库 database(),如果登录的时候没有指定默认数据库,且没有应用 USE 命令切换数据,则返回 NULL。
SELECT DATABASE();
获取服务器和客户端版本号:
SELECT CLIENT_VERSION();
SELECT SERVER_VERSION();
服务器状态检测语句。如果服务器失常,返回一个数字(例如 1)。如果服务器异样,返回 error code。该 SQL 语法能兼容连接池对于 TDengine 状态的查看及第三方工具对于数据库服务器状态的查看。并能够避免出现应用了谬误的心跳检测 SQL 语句导致的连接池连贯失落的问题。
SELECT SERVER_STATUS();
咱们能够应用 SELECT NOW(); 来获取以后工夫,应用 SELECT TODAY(); 来获取以后日期,应用 SELECT TIMEZONE(); 获取以后时区。
正则表达式过滤
语法
WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_
正则表达式标准
确保应用的正则表达式合乎 POSIX 的标准,具体标准内容可参见 Regular Expressions
应用限度
不仅能针对表名(即 tbname 筛选)、binary/nchar 类型标签值进行正则表达式过滤,也反对一般列的过滤。
正则匹配字符串长度不能超过 128 字节。能够通过参数 maxRegexStringLen 设置和调整最大容许的正则匹配字符串,该参数是客户端配置参数,须要重启能力失效。
CASE 表达式
语法
CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
阐明
TDengine 通过 CASE 表达式让用户能够在 SQL 语句中应用 IF … THEN … ELSE 逻辑。
第一种 CASE 语法返回第一个 value 等于 compare_value 的 result,如果没有 compare_value 合乎,则返回 ELSE 之后的 result,如果没有 ELSE 局部,则返回 NULL。
第二种语法返回第一个 condition 为真的 result。如果没有 condition 合乎,则返回 ELSE 之后的 result,如果没有 ELSE 局部,则返回 NULL。
CASE 表达式的返回类型为第一个 WHEN THEN 局部的 result 类型,其余 WHEN THEN 局部和 ELSE 局部,result 类型都须要能够向其转换,否则 TDengine 会报错。
示例
某设施有三个状态码,显示其状态,语句如下:
SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;
统计智能电表的电压平均值,当电压小于 200 或大于 250 时认为是统计有误,修改其值为 220,语句如下:
SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;
JOIN 子句
TDengine 反对基于工夫戳主键的内连贯,即 JOIN 条件必须蕴含工夫戳主键。只有满足基于工夫戳主键这个要求,一般表、子表、超级表和子查问之间能够随便的进行内连贯,且对表个数没有限度。
一般表与一般表之间的 JOIN 操作:
SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts
超级表与超级表之间的 JOIN 操作:
SELECT *
FROM temp_stable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;
子表与超级表之间的 JOIN 操作:
SELECT *
FROM temp_ctable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;
相似地,也能够对多个子查问的查问后果进行 JOIN 操作。
嵌套查问
“嵌套查问”又称为“子查问”,也即在一条 SQL 语句中,“内层查问”的计算结果能够作为“外层查问”的计算对象来应用。
从 2.2.0.0 版本开始,TDengine 的查问引擎开始反对在 FROM 子句中应用非关联子查问(“非关联”的意思是,子查问不会用到父查问中的参数)。也即在一般 SELECT 语句的 tb_name_list 地位,用一个独立的 SELECT 语句来代替(这一 SELECT 语句被蕴含在英文圆括号内),于是残缺的嵌套查问 SQL 语句形如:
SELECT ... FROM (SELECT ... FROM ...) ...;
须要留神:
- 内层查问的返回后果将作为“虚构表”供外层查问应用,此虚构表倡议起别名,以便于外层查问中不便援用。
- 在内层和外层查问中,都反对一般的表间 / 超级表间 JOIN。内层查问的计算结果也能够再参加数据子表的 JOIN 操作。
- 内层查问反对的性能个性与非嵌套的查问语句能力是统一的。
- 内层查问的 ORDER BY 子句个别没有意义,倡议防止这样的写法免得无谓的资源耗费。
- 与非嵌套的查问语句相比,外层查问所能反对的性能个性存在如下限度(计算函数局部):
- 如果内层查问的后果数据未提供工夫戳,那么计算过程隐式依赖工夫戳的函数在外层会无奈失常工作。例如:INTERP, DERIVATIVE, IRATE, LAST_ROW, FIRST, LAST, TWA, STATEDURATION, TAIL, UNIQUE。
- 如果内层查问的后果数据不是按工夫戳有序,那么计算过程依赖数据按工夫有序的函数在外层会无奈失常工作。例如:LEASTSQUARES, ELAPSED, INTERP, DERIVATIVE, IRATE, TWA, DIFF, STATECOUNT, STATEDURATION, CSUM, MAVG, TAIL, UNIQUE。
- 计算过程须要两遍扫描的函数,在外层查问中无奈失常工作。例如:此类函数包含:PERCENTILE。
写在最初
受篇幅所限,本文仅论述了在进行 SQL 查问时局部细则及注意事项,对于后果集列名、伪列、查问对象、GROUP BY 等子句的应用规定以及相干语法示例,大家能够进入官网文档——https://docs.taosdata.com/taos-sql/select/#group-by 进行查阅。在应用 TDengine 执行 SQL 查问时,以上实操手册会帮忙你解决一系列根底问题。但如果你遇到的问题迟迟未能解决,也不要焦急,能够增加小 T 微信(tdengine)向 TDengine 技术人员寻求帮忙。