首页 > 其他分享 >TDengine 建模实战:手把手教你高效设计数据结构

TDengine 建模实战:手把手教你高效设计数据结构

时间:2024-09-14 16:56:28浏览次数:14  
标签:TDengine power 手把手 用电量 建模 查询 device select

作为一款高效简洁的大数据平台,TDengine 的使用体验极为极为流畅,用户可以轻松实现数据的实时采集、存储与分析,快速获取所需的信息和洞察。但在追求最佳实践的过程中,我们仍需关注一些关键问题。例如,多个设备是否应该向同一个子表写入数据?在数据列过滤查询与基于标签的过滤查询之间,效率的差异有多大?此外,如何实现数据的高效压缩也是值得探讨的话题。本篇文章将通过具体的案例分析,详细讲解这些问题,以期帮助大家更深入地理解并高效使用 TDengine。


TDengine 建模实战:手把手教你高效设计数据结构_tdengine

TDengine 建模实战:手把手教你高效设计数据结构_tdengine_02

01

场景描述

以某智能电表为例,可采集电压、电流、漏电流、线路端子温度、有功功率、功率因数、电量等参数,数据每 2 分钟通过 mqtt 上报一次,通过 TDengine mqtt 可视化连接器进行采集,需要对各个累计电量和平均功率进行统计。

02

需求描述

聚焦用电量和平均功率统计分析:

  • 查询用电量
  • 年度总耗电量- 昨日用电量
  • 用电趋势,最近 30 天,每天的用电量
  • 查询近 24 小时的设备功率趋势,按小时展示,每个小时的数据为:该小时单位内,每个设备平均功率的总和

03

建模和存在问题

01

TDengine 建模实战:手把手教你高效设计数据结构_support_03

建模内容

TDengine 建模实战:手把手教你高效设计数据结构_news_04

02

TDengine 建模实战:手把手教你高效设计数据结构_support_03

建模说明

  1. 客户为了将超级表通用化,避免不同表具字段数目不统一情况,所以用了变量类型、 变量值和变量名称 3 个字段,将宽表模型变成了单列模型
  2. 由于变量值包括整型、 浮点型 、离散型等,便将其设置为字符串类型 ,便于不同类型数据都能写入
  3. 目前 var_name 列基数为 {current,power}
  1. cum_power:当前用电量
  2. power :功率

03

TDengine 建模实战:手把手教你高效设计数据结构_support_03

查询效果

目前查询近半年的数据每个月的累计值需要近 20 秒。

04

TDengine 建模实战:手把手教你高效设计数据结构_support_03

建模问题点评

客户的建模方式虽然可以对各种场景适配,但不是最优建模,存在以下问题:

  1. 对于来自同一电表的多个数据字段,将其分别处理成多个独立的插入(insert)操作。在每次插入操作时,系统会利用本地时间生成精确到毫秒的时间戳,确保每个记录都具有独特的时间标记。然而,在处理大量电表数据的情况下,由于缺乏批量插入的策略,这种逐条记录的插入方法可能会导致性能上的不足。
  2. 由于将不同采集量的数值汇总至同一字段,导致数值之间的差异极大,这不仅影响了一级增量(delta)压缩的效率,还增加了存储空间的占用。
  3. 当来自同一电表的不同采集量数据被存储在同一字段中时,由于数据量的差异,无法实现在磁盘上的连续存储。这种情况在查询过程中会导致与磁盘的交互次数显著增加,从而严重影响查询效率。
  4. 由于所有采集值都被存储在同一个字段中,每次查询特定采集量时,都需要进行数据过滤。此外,相对于标签字段,动态字段通常不支持索引,即使该字段理论上可以索引,但由于列的基数较低,建立的索引也无法提供有效的性能提升。在数据量较大的情况下,这将不可避免地导致查询速度变慢。

04

建议建模内容

按照宽表形式展示,对于不同类型的设备,建立不同的超级表。

TDengine 建模实战:手把手教你高效设计数据结构_support_08

05

相关语句

01

TDengine 建模实战:手把手教你高效设计数据结构_support_03

建表语句


create STABLE  if not exists iot.device (ts timestamp, cum_power double, power double,mode TINYINT, note BINARY(500))TAGS ( project_id INT);




create table serial_number using device tags(1)

02

TDengine 建模实战:手把手教你高效设计数据结构_support_03

查询用电量

  • 当月总耗电量
select sum(a) from (select spread(cum_power)as a from iot.device where project_id=1 and ts>to_char(now,"yyyy-mm-01") partition by tbname)


当年总耗电量

select sum(a) from (select spread(cum_power)as a from iot.device where project_id=1 and ts>to_char(now,"yyyy-01-01")  partition by tbname)

昨日用电量

select sum(a) from (select spread(cum_power)as a from iot.device where project_id=1 and ts<timetruncate(now,1d) and ts>=(timetruncate(now,1d)-1d)  partition by tbname)


  • 用电趋势,最近 30 天、每天的用电量
select last(t),sum(a) from (select _wstart as t,spread(cum_power)as a from iot.device where project_id=1 and ts<now and ts>=(timetruncate(now,1d)-30d)  partition by tbname interval(1d) order by t) interval(1d)

03

TDengine 建模实战:手把手教你高效设计数据结构_support_03

查询功率相关

  • 查询近 24 小时的设备功率趋势——按小时展示每个设备平均功率的总和
select last(t),sum(a) from(select _wstart as t,avg(power)as a from iot.device where project_id=1 and ts<now and ts>=(timetruncate(now,1h)-24h) partition by tbname interval(1h) order by t)interval(1h)

06

总结

TDengine 的高效写入、查询性能和数据压缩能力,得益于其创新的“一个设备一张表”的设计理念。因此,在进行数据建模时,我们应以这一理念为指导,确保系统的长期稳定性和性能最优化,有效预防未来数据量剧增时可能出现的结构性调整需求,从而减少潜在的复杂性和成本。





标签:TDengine,power,手把手,用电量,建模,查询,device,select
From: https://blog.51cto.com/tdengine/12017796

相关文章

  • 升压斩波电路的simulink建模与仿真
    1.课题概述升压斩波电路的simulink建模与仿真,通过双闭环结构实现电池,点击的控制。 2.系统仿真结果   3.核心程序与模型版本:MATLAB2022a  4.系统原理简介      升压斩波电路(BoostChopperCircuit)是一种电力电子转换电路,主要用于将输入直流电压升高到......
  • 升压斩波电路的simulink建模与仿真
    1.课题概述升压斩波电路的simulink建模与仿真,通过双闭环结构实现电池,点击的控制。2.系统仿真结果3.核心程序与模型版本:MATLAB2022a4.系统原理简介升压斩波电路(BoostChopperCircuit)是一种电力电子转换电路,主要用于将输入直流电压升高到更高的直流电压水平。该电路通过周期......
  • 目标检测与比对,使用yolov5s跑数据集构建模型
    1.1数据集下载我使用的是下面的数据集,有需要可去以下链接下载trianA数据集下载链接:https://pan.baidu.com/s/1zj3MqZEHKHpFACs95Ov4gQ?pwd=ma1ptrianB数据集下载链接:https://pan.baidu.com/s/1whg_-jLfbUnfpZkKjvdziQ?pwd=yg54 1.2yolov5s下载(1)官网......
  • 开源数据集 FreiHAND rgb 三维手势建模 手部关键点 >> DataBall
    开源数据集FreiHANDrgb三维手势建模手部关键点manohand混合现实深度学习人工智能FreiHAND是一个用于评估和训练深度神经网络以从单色图像中估计手部姿态和形状的数据集,这是在我们的论文中提出的。其当前版本包含32560个独特的训练样本和3960个独特的评估样本。训......
  • 保姆级,手把手教你物理机搭建Redis-sentinel(哨兵)集群
    集群介绍        Redis,作为一种开源的、基于内存的数据结构存储系统,被广泛应用于各种场景,包括缓存、消息队列、短期存储等。单一实例的工作模式通常无法保证Redis的可用性和拓展性,Redis提供了三种分布式方案:主从模式哨兵模式集群模式      主从模式    ......
  • 抓包工具检测手把手教学 - 某招聘网站
    大家好,我是南枫~~~先问大家一个问题,你们有没有遇到过想爬一个网站,想用老方法,直接右键打开抓包工具,此时,突然!整个页面都变得空白,什么数据都没有了的情况……如果你没遇到过那你去看看这个网站:https://talent.baidu.com/jobs/social-list?search=Python (百度招聘网站)打开......
  • 零基础学JAVA-day01-JDK的下载和安装(手把手系列)
    首先我们得知道JDK是什么,JDK(JavaDevelopmentKit)是Java开发工具包,它是开发Java应用程序的基础。JDK包含了编写、编译、调试和运行Java程序所需的所有工具和资源。下载JDK为了开始使用Java编程,你需要在计算机上安装JDK。你可以从Oracle官方网站或其他可信源......
  • 手把手教你制作最简网页版倒计时程序(核心代码仅25行)
    一、解构如图所示,手机浏览器的效果。代码就是简单的html语言加上一个JavaScript脚本,界面主要分3部分,功能实现主要分3个函数。(一)显示样式在头里定义了居中显示的CSS样式,将来在浏览器中居中显示倒计时X分XX秒。<styletype="text/css">   .center{      positio......
  • 0 需求工程 需求分析方法/建模
    1、软件需求的分类有哪些?2、高质量的软件需求规格说明包含哪7个特性?3、软件开发模型是什么,目前有哪些主流的开发模型?4、什么是瀑布式模型,有哪些特点,哪些缺点?5、什么是快速原型模型?6、快速原型的目的有哪些,有哪些特点,哪些缺点?7、什么是渐增式模型,有哪些特点,哪些缺点?8、什么......
  • 渗透工具包_移动端内网渗透思路_手把手教网安自学路线_安卓渗透思路
    ......