TDengine RSMA — 时间维度的滚动预聚合
分类:8.预聚合 |篇章:01 RSMA
适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-07-06
RSMA(Rollup SMA,滚动小型聚合)让 TDengine 自动维护多层时间粒度的预聚合数据。原始秒级数据存几天 → 分钟级聚合存几个月 → 小时级聚合存几年,存储成本降数量级,长时间范围查询毫秒返回。
核心概念速查表
| 概念 | 说明 |
|---|---|
| RSMA | Rollup SMA,滚动预聚合 |
| Rollup Level | 聚合层级(如原始/1m/1h) |
| Retention | 各层级的保留时长 |
| Funcs | 预聚合的聚合函数 |
| Auto Rollup | 自动按时间滚动 |
详细解析
1. RSMA 的设计动机
时序数据的痛点: ① 原始数据量巨大: 1000 设备 × 每秒 1 次 × 1 年 = 315 亿行 → 存储成本高 ② 长时间范围查询慢: 一年的趋势图:要扫描 315 亿行 → 数分钟~小时 ③ 大多数查询不需要原始精度: 季度报表用日数据 年报表用月数据 原始秒数据浪费 RSMA 的解: 原始秒数据 → 自动滚动 → 分钟聚合 → 小时聚合 各层级独立保留期 查询时自动选择最合适的层级2. RSMA 数据库配置
-- 创建带 RSMA 的数据库CREATEDATABASErsma_dbPRECISION'ms'KEEP365d DURATION10d MAXROWS4096-- 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 的超级表CREATESTABLE meters(tsTIMESTAMP,currentFLOAT,voltageINT,phaseFLOAT)TAGS(locationVARCHAR(32),groupidINT)ROLLUP(AVG);-- 指定预聚合函数-- 多个聚合函数CREATESTABLE meters_full(tsTIMESTAMP,currentFLOAT,voltageINT)TAGS(locationVARCHAR(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. 创建数据库CREATEDATABASEpower_dbPRECISION'ms'KEEP1825-- 5 年DURATION30d RETENTIONS'1s:7d,1m:30d,1h:5y';USEpower_db;-- 2. 创建超级表CREATESTABLE meters(tsTIMESTAMP,currentFLOAT,voltageINT,phaseFLOAT)TAGS(locationVARCHAR(32),groupidINT)ROLLUP(AVG,MAX,MIN);-- 3. 写入数据INSERTINTOd001USINGmeters TAGS('Beijing',1)VALUES(NOW,25.3,220,0.5);-- 自动后台滚动聚合-- 4. 查询SELECT_wstart,AVG(current)FROMmetersWHEREts>now-1yINTERVAL(1d);-- 自动使用小时聚合层检查 RSMA 状态
-- 查看数据库 RSMA 配置SELECTname,precision,retentions,keepFROMinformation_schema.ins_databasesWHEREname='power_db';-- 查看超级表 ROLLUP 设置SELECT*FROMinformation_schema.ins_stablesWHEREstable_name='meters';性能考量
RSMA 存储节省
| 层级 | 数据量比例 | 适用查询 |
|---|---|---|
| 原始(1s) | 100% | < 1 天范围 |
| 分钟(1m) | ~1.7% | 1 天~1 月 |
| 小时(1h) | ~0.03% | 1 月~1 年+ |
查询性能提升
| 查询范围 | 不用 RSMA | 用 RSMA |
|---|---|---|
| 1 小时 | 100ms | 100ms |
| 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 配置,更灵活,支持任意聚合表达式
参考
系统构架篇
- 01-《TDengine 整体架构全景》
- 02-《集群拓扑深度解析》
- 03-《MNode 内部机制深度解析》
- 04-《RPC 通信层深度解析》
- 05-《VNode 生命周期》
- 06-《RAFT 共识协议》
- 07-《端到端的消息流》
数据模型
- 01-《数据库创建与参数详解》
- 02-《超级表/子表/普通表》
- 03-《支持数据类型深度解析》
- 04-《TDengine Tag 设计哲学与 Schema 变更机制》
- 05-《TDengine 虚拟表实现原理》
存储引擎
- 01-《TDengine 存储引擎概览》
- 02-《TDengine MemTable 深度解析》
- 03-《TDengine WAL 预写日志机制》
- 04-《TDengine 数据文件格式》
- 05-《TDengine Commit 与 Flush 机制 》
- 06-《TDengine Compaction 合并策略 》
- 07-《TDengine 数据保留与 TTL》
- 08-《TDengine 压缩编码机制》
- 09-《TDengine Cache 与 Last 查询加速》
- 10-《TDengine 逻辑计划生成》
查询引擎
- 01-《TDengine 查询引擎概览》
- 02-《TDengine SQL 解析与词法分析》
- 03-《TDengine 语义分析与 AST 重写》
- 04-《TDengine 逻辑计划生成》
- 05-《TDengine 物理计划生成》
- 06-《TDengine 扫描算子》
- 07-《TDengine 聚合算子》
- 08-《TDengine 聚合算子》
- 09-《TDengine 连接算子》
- 10-《TDengine 排序、填充与投影》
- 11-《TDengine 分布式查询执行》
- 12-《TDengine EXPLAIN 与查询优化》
数据写入
- 01-《TDengine SQL INSERT》
- 02-《TDengine 无模式写入》
- 03-《TDengine STMT 写入》
- 04-《TDengine 写入内部流程》
- 05-《TDengine 数据更新删除》
数据订阅
- 01-《TDengine 数据订阅》
- 02-《TDengine 订阅 vs Kafka》
- 03-《TDengine TMQ 消费流程》
- 04-《TDengine 内部机制》
- 05-《TDengine 内部机制》
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
