工业数据为什么要时序库

一条产线几千个点位,每个点每秒一条数据,一天就是上亿条。温度、压力、振动、电流都是带时间戳的序列,这种数据叫时序数据。用关系库硬扛,表越写越大,查询越来越慢,这就是工业数据平台卡顿的根源。

时序数据库按时间组织数据,写入快、压缩率高、聚合查询是内置能力。国产的 TDengine 在工业界用得很多,开源、SQL 兼容、集群部署简单,下面就用它讲清楚工业时序数据的存储实战。

本文核心知识点
  • 超级表同一类型设备一张模板表。
  • 子表每台设备一张,带标签。
  • 降采样interval 按时间聚合。
  • 集成边缘网关写入、OPC UA 对接。

核心思路:把设备的静态属性(编号、产线、位置)做成标签,把随时间变化的量(温度、电流)做成列,查询时按标签过滤、按时间聚合,海量点位也能秒级出结果。

TDengine 配图:深蓝渐变背景上堆叠的蓝色存储圆柱体顶部发光数据点向上延伸,周围流动光波曲线的扁平科技插画
时间戳加测点,就是工业数据的本质。

TDengine 核心概念

TDengine 有三个关键概念:库、超级表、子表。库对应一个数据域,超级表定义字段结构,子表继承结构并绑定具体设备标签。

  • 库:CREATE DATABASE,可设保留天数、副本数、分区数。
  • 超级表:STABLE,定义时间戳列、测点列、标签列。
  • 子表:实际存储数据的表,TAGS 绑定设备属性。
  • 标签:字符串或数值,用于过滤,不随数据增长。

理解了这个模型,写入和查询就顺了:每台设备一个子表,查某台设备直接查它的子表,查整个车间按标签过滤所有子表,统计聚合由引擎并行完成。

建表与写入

先建库和超级表,再建子表,之后就是往里写数据。TDengine 支持标准 SQL,写入用 INSERT 语句,批量写效率更高。

-- 建库:数据保留 180 天
CREATE DATABASE factory KEEP 180 DURATION 10 BUFFER 256;

-- 建超级表:测点列 + 标签列
CREATE STABLE factory.meter (
  ts TIMESTAMP,
  voltage FLOAT,
  current FLOAT,
  temp FLOAT
) TAGS (line INT, device_id NCHAR(32));

-- 建子表并写数据
CREATE TABLE factory.m_001 USING factory.meter TAGS (1, 'D001');
INSERT INTO factory.m_001 VALUES (NOW, 220.5, 12.3, 45.6);

-- 批量写入(每行一个测点)
INSERT INTO factory.m_001 VALUES
  (NOW - 1s, 220.4, 12.2, 45.5),
  (NOW, 220.6, 12.4, 45.7);

标签不要建太多,一般十几列以内;标签值变化要重建子表。写入时间戳建议统一用设备本地时间,跨时区或网络延迟大的场景要约定好口径,否则聚合会错位。

查询与降采样

时序查询最常用的是降采样:把秒级原始数据按分钟、小时聚合成趋势数据,报表和看板直接查聚合结果,快得多。

-- 每 10 分钟一个聚合点:均值、最大值、最新值
SELECT _wstart, AVG(current), MAX(temp), LAST(voltage)
FROM factory.meter
WHERE line = 1
INTERVAL(10m);

-- 查某设备最近一小时原始数据
SELECT ts, voltage, current FROM factory.m_001
WHERE ts >= NOW - 1h;

-- 每台设备最近一条(配合标签)
SELECT device_id, LAST(current) FROM factory.meter
WHERE line = 1 GROUP BY device_id;

INTERVAL 聚合默认按时间窗分组,_wstart 是窗口起点。趋势看板用 10 分钟或 1 小时粒度,追溯故障才查原始数据,这样存储和查询压力都能控住。