【TDengine3.3.6】按照设备建表方案推荐

【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境

【TDengine 版本】

3.3.6

【操作系统以及版本】

CentOS 7.9

【部署方式】非容器部署

【描述业务影响】

系统需要把五六个平台的设备数据拉过来并入库,现在建表遇到了方案上的选择,我指定了三个方案不知道哪个更适合当前场景和TDengine数据库,有经验的可以推荐一下用哪个方案。
背景:设备采集的数据由于是不同平台过来的,所以采集的数据会有路数上的问题,例如:
现在设备需要建三个表,基础实时数据表,mppt实时数据表,pv输入实时数据表,所有平台的采集频率都是5分钟采集一次,每次采集会拉取设备的所有数据,对于同一个设备而言各采集指标同时采集,采集时间戳相同

【遇到的问题:问题现象及影响】
A方案:以所有平台设备路数最大的为基准建表,没有的存null
– MPPT 宽表:电压+电流合并,60列,一次写入完整数据
CREATE STABLE IF NOT EXISTS inverter_mppt (
ts TIMESTAMP,
mppt_vol_1 FLOAT, mppt_cur_1 FLOAT,
mppt_vol_2 FLOAT, mppt_cur_2 FLOAT,
……
mppt_vol_30 FLOAT, mppt_cur_30 FLOAT

) TAGS (inverter_id BIGINT);

– PV 宽表:电压+电流+功率,120列(功率可选,没有的平台写NULL)
CREATE STABLE IF NOT EXISTS inverter_pv (
ts TIMESTAMP,
pv_vol_1 FLOAT, pv_cur_1 FLOAT, pv_pow_1 FLOAT,
pv_vol_2 FLOAT, pv_cur_2 FLOAT, pv_pow_2 FLOAT,
……
pv_vol_40 FLOAT, pv_cur_40 FLOAT, pv_pow_40 FLOAT

) TAGS (inverter_id BIGINT);

B方案:不用宽表,存路数,行数会增加,一个设备多少路就存多少行,兼容不同平台路数不同问题,但这样ts插入时间可能需要偏移,不然同一设备下的采集数据时间戳相同无法插入

– MPPT回路窄表
CREATE STABLE IF NOT EXISTS inverter_mppt (
ts TIMESTAMP, — 主键,入库时间戳
minute_c TIMESTAMP, — 数据采集时间戳
idx TINYINT, — 1~36路路数
dc_mppt_vol FLOAT, — mppt电压
dc_mppt_cur FLOAT — mppt电流
)
TAGS (
inverter_id NCHAR(32)
);

– PV组串窄表
CREATE STABLE IF NOT EXISTS inverter_pv (
ts TIMESTAMP, — 主键,入库时间戳
minute_c TIMESTAMP, — 数据采集时间戳
idx TINYINT, — 1~40路路数
dc_pv_vol FLOAT, — pv电压
dc_pv_cur FLOAT, — pv电流
dc_pv_pow FLOAT — pv功率
)
TAGS (
inverter_id NCHAR(32)
);

方案C:

同方案B,只不过将路数idx存在TAGS中,这样会解决存储时ts主键时间戳偏移的问题,但是子表会增加,相当于一个设备+一路为一个子表

建议使用 方案C,不同路数通过不同的子表来区分。

我目前也是觉得A和C

A宽表方案,5分钟采集的数据一次性写入,吞吐大,IO损耗小,一个设备一个子表;缺点字段数多,维护不方便。

C窄表方案,表字段少,动态扩容不同平台路数,缺点行数增加,子表数量增加,一个设备一路一个子表,3万个设备再乘40路大约120万个子表

想咨询一下对于TDengine来说,一个超级表下面不建议超过多少子表呢?

超级表的列数多 或者 子表数多 哪个更影响性能?

超级表下的子表数量没有限制。只是子表数量 需要对应数量的vnodes处理支持。

根据采样频率、表列数等,建议是 一个vnode支持 2~10 万子表。