分类: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 的数据库
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 小时 | 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 提供实时分析、可视化、事件管理与报警等功能。


248

被折叠的 条评论
为什么被折叠?



