TDengine RSMA — 时间维度的滚动预聚合

分类:8.预聚合 | 篇章:01 RSMA
在这里插入图片描述
适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-07-06

RSMA(Rollup SMA,滚动小型聚合)让 TDengine 自动维护多层时间粒度的预聚合数据。原始秒级数据存几天 → 分钟级聚合存几个月 → 小时级聚合存几年,存储成本降数量级,长时间范围查询毫秒返回。

核心概念速查表

概念说明
RSMARollup SMA,滚动预聚合
Rollup Level聚合层级(如原始/1m/1h)
Retention各层级的保留时长
Funcs预聚合的聚合函数
Auto Rollup自动按时间滚动

详细解析

1. RSMA 的设计动机

时序数据的痛点:

  ① 原始数据量巨大:
     1000 设备 × 每秒 1 次 × 1 年 = 315 亿行
     → 存储成本高
     
  ② 长时间范围查询慢:
     一年的趋势图:要扫描 315 亿行
     → 数分钟~小时
     
  ③ 大多数查询不需要原始精度:
     季度报表用日数据
     年报表用月数据
     原始秒数据浪费


RSMA 的解:
  原始秒数据 → 自动滚动 → 分钟聚合 → 小时聚合
  各层级独立保留期
  查询时自动选择最合适的层级

2. RSMA 数据库配置

-- 创建带 RSMA 的数据库
CREATE DATABASE rsma_db 
  PRECISION 'ms' 
  KEEP 365d 
  DURATION 10d 
  MAXROWS 4096
  -- RSMA 关键参数 --
  RETENTIONS '1d:30d,1m:60d,1h:1y';

含义:
  - 1d:30d  → 原始数据保留 30- 1m:60d  → 分钟聚合保留 60- 1h:1y   → 小时聚合保留 1 年


RETENTIONS 格式:
  '<层级粒度>:<保留期>, ...'
  - 层级粒度:1s, 1m, 1h, 1d 等
  - 保留期:单位 d/w/n/y


最多 3 层:
  原始 + 第一层 + 第二层

3. RSMA 超级表

-- 创建支持 RSMA 的超级表
CREATE STABLE meters (
  ts TIMESTAMP,
  current FLOAT,
  voltage INT,
  phase FLOAT
) TAGS (
  location VARCHAR(32),
  groupid INT
) 
ROLLUP(AVG);    -- 指定预聚合函数

-- 多个聚合函数
CREATE STABLE meters_full (
  ts TIMESTAMP,
  current FLOAT,
  voltage INT
) TAGS (
  location VARCHAR(32)
) 
ROLLUP(AVG, MAX, MIN, SUM, FIRST, LAST);


ROLLUP 支持的函数:
  - AVG, SUM, MAX, MIN, FIRST, LAST, COUNT
  - 适合分布性聚合(满足结合律)

4. RSMA 数据流

数据流转过程:

  写入: T0 (原始秒级数据)
            ↓
        原始数据存储
            ↓
        自动滚动 (每分钟)
            ↓
        计算 AVG/MAX/MIN 等
            ↓
        分钟聚合存储
            ↓
        自动滚动 (每小时)
            ↓
        小时聚合存储
            
            
保留期管理:
  - 原始数据超过 30 天 → 自动删除
  - 分钟聚合超过 60 天 → 自动删除
  - 小时聚合超过 1 年 → 自动删除


存储节省(示例):
  原始数据 1TB
  分钟聚合 ~17GB (60倍压缩)
  小时聚合 ~280MB (3600倍压缩)

5. RSMA 查询

查询自动选择层级:

  -- 查询最近 1 小时(命中原始)
  SELECT _wstart, AVG(current) FROM meters 
  WHERE ts > now-1h INTERVAL(1m);
  → 使用原始数据
  
  -- 查询最近 30 天(命中分钟聚合)
  SELECT _wstart, AVG(current) FROM meters 
  WHERE ts > now-30d INTERVAL(1h);
  → 自动使用分钟聚合层
  
  -- 查询最近 1 年(命中小时聚合)
  SELECT _wstart, AVG(current) FROM meters 
  WHERE ts > now-1y INTERVAL(1d);
  → 自动使用小时聚合层


引擎的选择逻辑:
  ① 查询时间范围
  ② 聚合粒度 (INTERVAL)
  ③ 所需函数(必须在 ROLLUP 列表中)
  ④ 选择满足所有条件的最高层级

6. RSMA 与流计算的区别

特性RSMA流计算
触发数据库内置显式创建
配置DDL(建库/表时)CREATE STREAM
查询透明(自动选层)查询不同表
灵活性低(固定函数)
适用通用聚合复杂业务逻辑
维护系统自动用户管理

7. RSMA 与传统数据归档对比

传统方式:
  1. 手写 ETL 脚本
  2. 定时任务调度
  3. 中间数据库管理
  4. 查询时手动选择源表
  
  问题:
  - 维护复杂
  - 时间窗口边界处理麻烦
  - 重复代码
  
  
RSMA 优势:
  - 数据库内置
  - 零维护
  - 查询透明
  - 时间精度精准

8. RSMA 限制与注意

限制:
  ① 必须建库时配置 RETENTIONS(不可后改)
  ② 必须建表时指定 ROLLUP
  ③ 最多 3 层(原始 + 2 层聚合)
  ④ 仅支持分布性聚合函数
  ⑤ Tag 不参与聚合
  
注意事项:
  - 滚动计算消耗 CPU
  - 占用磁盘(但远少于原始)
  - 一旦数据到达保留上限 → 不可恢复


不适合 RSMA 的场景:
  - 需要任意精度的历史数据
  - 复杂聚合(PERCENTILE 等)
  - 业务变更频繁需重算

代码示例

完整 RSMA 配置

-- 1. 创建数据库
CREATE DATABASE power_db 
  PRECISION 'ms' 
  KEEP 1825    -- 5 年
  DURATION 30d 
  RETENTIONS '1s:7d,1m:30d,1h:5y';

USE power_db;

-- 2. 创建超级表
CREATE STABLE meters (
  ts TIMESTAMP,
  current FLOAT,
  voltage INT,
  phase FLOAT
) TAGS (location VARCHAR(32), groupid INT) 
  ROLLUP(AVG, MAX, MIN);

-- 3. 写入数据
INSERT INTO d001 USING meters TAGS('Beijing', 1) 
VALUES (NOW, 25.3, 220, 0.5);
-- 自动后台滚动聚合

-- 4. 查询
SELECT _wstart, AVG(current) 
FROM meters 
WHERE ts > now-1y 
INTERVAL(1d);
-- 自动使用小时聚合层

检查 RSMA 状态

-- 查看数据库 RSMA 配置
SELECT name, precision, retentions, keep 
FROM information_schema.ins_databases 
WHERE name='power_db';

-- 查看超级表 ROLLUP 设置
SELECT * FROM information_schema.ins_stables 
WHERE stable_name='meters';

性能考量

RSMA 存储节省

层级数据量比例适用查询
原始(1s)100%< 1 天范围
分钟(1m)~1.7%1 天~1 月
小时(1h)~0.03%1 月~1 年+

查询性能提升

查询范围不用 RSMA用 RSMA
1 小时100ms100ms
1 天1 秒1 秒
1 月30 秒1 秒
1 年6 分钟5 秒

写入开销

RSMA 滚动计算异步进行,对写入吞吐影响 < 10%。

FAQ

Q1: 建库后能修改 RSMA 配置吗?

不可以。必须建库时确定。如需调整,新建库迁移数据。

Q2: ROLLUP 函数可以增加吗?

不可以。建表后固定。如需增加新函数,需重建表。

Q3: 查询某些条件不命中 RSMA 怎么办?

引擎自动降级到原始层。WHERE 含数据列过滤通常会降级(聚合层无单行数据)。

Q4: RSMA 数据可见吗?

不直接可见。用户查询超级表,引擎自动选择层级,对用户透明。

Q5: RSMA 和 TSMA 区别?

  • RSMA:固定层级(时间维度),自动滚动
  • TSMA:按 INDEX 配置,更灵活,支持任意聚合表达式

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDengine (老段)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值