TDengine TSMA — 时间维度的物化聚合视图

TDengine TSMA — 时间维度的物化聚合视图
分类8.预聚合 |篇章02 TSMA适用版本TDengine v3.xv3.3.x / v3.4.x | 最后更新2026-07-07TSMATime-Range SMA是 RSMA 之外的另一种预聚合方式类似于关系数据库的物化视图。用户为某超级表显式创建 TSMA指定聚合函数和时间间隔查询时引擎自动判断命中。核心概念速查表概念说明TSMATime-Range SMAINTERVALTSMA 的聚合粒度Func预聚合的函数列表Auto Maintenance写入时自动维护Query Routing查询自动路由详细解析1. TSMA 与 RSMA 对比RSMA - 数据库级配置 - 固定 3 层 - 仅 ROLLUP 函数 - 数据按 RETENTIONS 自动过期 - 建库时定义 TSMA - 表级配置 - 任意数量 TSMA - 任意聚合函数 - 与超级表共享生命周期 - 任意时刻 CREATE/DROP 典型场景 RSMA: 大规模时序需要分层存储 TSMA: 已有超级表针对特定聚合需求加速2. 创建 TSMA-- 基础语法CREATETSMA tsma_nameONsuper_table_nameFUNCTION(func1,func2,...)INTERVAL(duration);-- 示例电流的多个聚合CREATETSMA meters_1hONmetersFUNCTION(AVG(current),MAX(current),MIN(current),COUNT(*))INTERVAL(1h);效果-TDengine 后台为 meters 维护1小时粒度的预聚合-查询 AVG/MAX/MIN/COUNT 时优先用 TSMA3. 多 TSMA 共存-- 多层 TSMACREATETSMA meters_5mONmetersFUNCTION(AVG(current),MAX(current))INTERVAL(5m);CREATETSMA meters_1hONmetersFUNCTION(AVG(current),MAX(current),SUM(voltage))INTERVAL(1h);CREATETSMA meters_1dONmetersFUNCTION(AVG(current),MAX(current))INTERVAL(1d);查询时自动选择-- 命中 1m 粒度查询 → 用 meters_5mSELECT_wstart,AVG(current)FROMmetersWHEREtsnow-1hINTERVAL(5m);-- 命中 1h 粒度查询 → 用 meters_1hSELECT_wstart,AVG(current)FROMmetersWHEREtsnow-7dINTERVAL(1h);-- 命中 1d 粒度查询 → 用 meters_1dSELECT_wstart,AVG(current)FROMmetersWHEREtsnow-1yINTERVAL(1d);最优 TSMA 选择算法 ① 找出粒度 ≤ 查询INTERVAL的所有 TSMA ② 在其中选最大粒度覆盖最多数据 ③ 必须包含查询所需的所有函数4. TSMA 的自动维护写入时维护 ① 应用 INSERT 数据 ② 写入原始数据 ③ 异步触发 TSMA 更新 - 找到对应窗口 - 增量更新聚合状态 - 持久化 查询时优化 ① Parser 识别查询 ② Optimizer 评估可用 TSMA ③ 选择最优 TSMA ④ 重写查询计划 ⑤ 执行 窗口归属 数据 ts12:34:56 → 5 分钟 TSMA归属 [12:30, 12:35) → 1 小时 TSMA归属 [12:00, 13:00)5. TSMA 命中条件查询命中 TSMA 的必要条件 ① INTERVAL 是 TSMA INTERVAL 的整数倍 TSMA 5m 可命中 SQL INTERVAL 5m/10m/15m/1h 不可命中 INTERVAL 3m ② 查询的聚合函数在 TSMA 函数列表中 TSMA FUNCTION(AVG, MAX) → 可命中 AVG/MAX 不可命中 SUM未预聚合 ③ 时间范围对齐 查询时间范围最好整窗口对齐 部分窗口可能需要原始数据补充 ④ WHERE 条件兼容 仅 Tag 过滤 → 可命中 数据列过滤 → 通常无法命中 用 EXPLAIN 检查是否命中 EXPLAIN SELECT _wstart, AVG(current) FROM meters WHERE ts now-7d INTERVAL(1h); → 查找 TSMA Scan 节点表明命中6. TSMA 与 PARTITION BY-- TSMA 是否考虑 PARTITION BY-- 答默认 TSMA 按超级表全局聚合-- 如需按子表需要 SELECT 中加入 tbname / Tag-- 推荐场景全表聚合CREATETSMA meters_global_1hONmetersFUNCTION(AVG(current))INTERVAL(1h);-- 查询命中SELECT_wstart,AVG(current)FROMmetersINTERVAL(1h);-- ✓ 命中-- 查询不命中SELECT_wstart,tbname,AVG(current)FROMmetersPARTITIONBYtbnameINTERVAL(1h);-- ✗ 不命中需按子表聚合-- 子表级 TSMA需要更复杂的设计-- 通常用流计算更灵活7. 管理 TSMA-- 查看所有 TSMASHOWTSMAS;-- 查看特定库的 TSMASHOWTSMASFROMdb_name;-- 查看详情SELECT*FROMinformation_schema.ins_tsmas;-- 删除DROPTSMA tsma_name;8. TSMA 性能与限制开销 ① 写入开销每个 TSMA 异步更新 5% 写入吞吐 ② 存储开销每个 TSMA 占用空间 1% 原始 ③ 维护开销失败时需要重算 限制 ① 仅支持基础聚合函数不支持复杂窗口 ② TSMA 不支持 ORDER BY/LIMIT ③ 不支持包含 JOIN 的查询 ④ TSMA 自身不可查询只能通过原查询命中代码示例真实场景电力监控分层-- 原始秒级数据CREATESTABLE meters(tsTIMESTAMP,currentFLOAT,voltageINT,phaseFLOAT)TAGS(locationVARCHAR(32),groupidINT);-- 5 分钟聚合用于实时监控CREATETSMA meters_5mONmetersFUNCTION(AVG(current),MAX(current),MIN(current),AVG(voltage),COUNT(*))INTERVAL(5m);-- 1 小时聚合用于日报表CREATETSMA meters_1hONmetersFUNCTION(AVG(current),MAX(current),MIN(current),AVG(voltage),MAX(voltage),MIN(voltage),SUM(current*voltage),COUNT(*))INTERVAL(1h);-- 1 天聚合用于年报CREATETSMA meters_1dONmetersFUNCTION(AVG(current),MAX(current),MIN(current),AVG(voltage),MAX(voltage))INTERVAL(1d);查询自动加速-- 实时仪表盘5 分钟粒度SELECT_wstart,AVG(current),MAX(current)FROMmetersWHEREtsnow-1hINTERVAL(5m);-- → 命中 meters_5m毫秒返回-- 日报小时粒度SELECT_wstart,AVG(current),AVG(voltage)FROMmetersWHEREtsnow-7dINTERVAL(1h);-- → 命中 meters_1h毫秒返回-- 年报日粒度SELECT_wstart,AVG(current),MAX(voltage)FROMmetersWHEREtsnow-1yINTERVAL(1d);-- → 命中 meters_1d秒级返回性能考量TSMA vs 直接查询查询无 TSMA有 TSMA1 小时聚合 1 月数据30 秒100ms1 天聚合 1 年数据6 分钟500ms5 分钟聚合 1 天5 秒50msTSMA vs 流计算维度TSMA流计算创建复杂度简单中灵活性中高查询透明✓ 自动需查不同表适用标准聚合复杂业务FAQQ1: TSMA 和 RSMA 能共存吗可以。RSMA 在数据库级别配置TSMA 在表级别。但不建议同时用重复开销。Q2: 创建 TSMA 会重算历史吗会。新建 TSMA 后引擎会扫描历史数据回填。耗时取决于数据量。Q3: 查询为什么没命中 TSMA常见原因INTERVAL 不是 TSMA INTERVAL 整数倍使用了 TSMA 未定义的函数WHERE 含数据列过滤PARTITION BY 与 TSMA 设计不符Q4: TSMA 失败如何处理引擎自动降级到原始数据查询结果正确但慢。后台会重试 TSMA 计算。Q5: 修改 TSMA 函数不支持。需要 DROP 后重新 CREATE。参考系统构架篇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 TMQ 最佳实践》预聚合01-《TDengine RSMA》关于 TDengineTDengine 专为物联网IoT平台、工业大数据平台设计。其中TDengine TSDB 是一款高性能、分布式的时序数据库Time Series Database同时它还带有内建的缓存、流式计算、数据订阅等系统功能TDengine IDMP 是一款AI原生工业数据管理平台它通过树状层次结构建立数据目录对数据进行标准化、情景化并通过 AI 提供实时分析、可视化、事件管理与报警等功能。