当前位置: 首页 > news >正文

TDengine 查询引擎概览 — SQL 从客户端到结果集的全景流转

分类:4.查询引擎 |篇章:01 查询引擎概览

适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-06-07

TDengine 的查询引擎是一套面向时序数据特征定制的分布式 SQL 执行框架。它从客户端解析 SQL 开始,经过语义分析、逻辑/物理计划生成、任务下发、算子并行执行、最终结果汇总,全过程围绕"按时间分片+按子表并行+按列裁剪"的核心理念展开。

核心概念速查表

概念说明
Parser将 SQL 文本转为抽象语法树(AST)
Translator语义分析、Catalog 校验、AST 重写
Logical Plan与执行引擎无关的关系代数表达
Physical Plan落地到具体算子的可执行计划
Scheduler任务调度器,决定子查询发到哪个节点
QNode专用查询节点(可选,分担 VNode 计算压力)
Operator执行算子(Scan/Filter/Aggregate/Join/Sort/…)
DataSink数据汇聚通道(连接算子间或节点间)

详细解析

1. 查询整体架构

查询执行的端到端流程: ┌─────────────────────────────────────────────────────┐ │ Client (libtaos) │ │ ① Parser → ② Translator → ③ Planner → ④ Scheduler │ └────────────────────────┬────────────────────────────┘ │ RPC 下发任务 ┌──────────────────┼──────────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ VNode 1 │ │ VNode 2 │ │ QNode │ │ 执行扫描 │ │ 执行扫描 │ ←─→ │ 汇总聚合 │ │ 本地聚合 │ │ 本地聚合 │ │ 排序合并 │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └──────────────────┴──────────────────┘ │ 结果回传 ▼ ┌──────────────────┐ │ Client │ │ 收集 + 输出 │ └──────────────────┘

2. 客户端处理阶段

SQL 在客户端的完整生命周期: SQL 字符串 │ ▼ ① Tokenizer(词法分析) 拆分为 Token 序列:SELECT, *, FROM, meters, WHERE, ts, >, '...' │ ▼ ② Parser(Lemon 生成的 LALR 语法分析器) 构建 AST(抽象语法树): SelectStmt ├── projection: [*] ├── from: meters └── where: ts > '...' │ ▼ ③ Translator(语义分析) - 查 Catalog 校验表/列是否存在 - 列名/类型绑定 - Tag 过滤下推到 Catalog 层(仅相关子表参与) - 重写 AST(如展开 *、补默认窗口等) │ ▼ ④ Logical Planner 生成逻辑算子树: Project └── Filter (ts > '...') └── Scan (meters) │ ▼ ⑤ Physical Planner - 分解为多个 SubPlan(按 VGroup 切分) - 每个 SubPlan 包含物理算子链 - 决定 Exchange 数据流方向 │ ▼ ⑥ Scheduler 将 SubPlan 下发到对应节点(VNode/QNode)

3. 服务端执行阶段

服务端算子执行模型(Pull-based + Pipeline): ┌──────────────────────────────────────────────────────┐ │ Result Operator(结果输出) │ │ │ getNextBlock() │ │ ▼ │ │ Aggregate Operator │ │ │ getNextBlock() │ │ ▼ │ │ Filter Operator │ │ │ getNextBlock() │ │ ▼ │ │ Scan Operator(读 MemTable + STT + .data) │ └──────────────────────────────────────────────────────┘ 特点: - Pull 模型:上层算子驱动下层算子产出数据 - 列式 DataBlock 在算子间流转(不是行流) - 一次产出一个 Block(默认 4096 行) - 算子无状态时可并行(多线程同时跑多个 Scan)

4. 数据传输:Exchange 与 DataSink

节点间的数据流: VNode 1 Scan VNode 2 Scan VNode 3 Scan │ │ │ ▼ ▼ ▼ DataSink: DataSink: DataSink: ShuffleDispatch ShuffleDispatch ShuffleDispatch │ │ │ └──────────┬─────┴──────────────────┘ ▼ ┌─────────────────┐ │ Exchange Operator│ ← QNode 或 Client 端 │ (按需 Fetch) │ └────────┬────────┘ ▼ Aggregate / Sort

5. 时序场景的查询优化点

优化说明
时间裁剪WHERE 含时间条件 → 仅扫描相关 File Set
Tag 索引WHERE Tag 条件 → META 索引返回 uid 列表,跳过无关子表
块级 SMACOUNT/MIN/MAX/SUM 直接读预聚合,免解压
列裁剪SELECT 中未引用的列不解压、不读取
并行扫描多 VGroup 并行,多子表并行
本地预聚合VNode 内先聚合再 Exchange,减少网络传输

6. QNode 与 VNode 的协作

QNode 的引入: 传统模式(VNode 既存储又计算): SELECT COUNT(*) FROM big_table GROUP BY tbname → 全部计算压在 VNode,CPU 与写入竞争资源 引入 QNode: Scan 在 VNode 完成(必须,靠近存储) 复杂计算(大规模 Sort/Hash Aggregate/Join)转到 QNode → 写入与查询解耦 → 可独立扩展查询能力 调度规则(简化): - 简单聚合 → VNode 本地完成 - 跨 VGroup 合并 → QNode 或 Client - 显式 USE_QNODE hint → 强制 QNode

7. 查询的并发与隔离

查询的并发模型: ┌────────────────────────────────────────┐ │ taosd 进程 │ │ │ │ 查询线程池(vnodeQueryQueue) │ │ ├── worker 1 → 处理 Query Task │ │ ├── worker 2 → 处理 Query Task │ │ └── worker N → 处理 Query Task │ │ │ │ 并发隔离: │ │ - 查询不阻塞写入(独立线程池) │ │ - 长查询不影响短查询(按 Task 调度) │ │ - 内存配额限制单查询占用 │ └────────────────────────────────────────┘

代码示例

观察查询执行计划

-- 查看查询计划EXPLAINSELECTavg(current)FROMmetersWHEREts>now-1h;-- 查看详细执行统计EXPLAINANALYZESELECTavg(current)FROMmetersWHEREts>now-1h;-- 查看慢查询SELECT*FROMperformance_schema.perf_queriesORDERBYexec_usecDESCLIMIT10;

配置查询资源

-- 查询线程数(taos.cfg)-- numOfVnodeQueryThreads 8-- 单查询内存上限ALTERALLDNODES'queryBufferSize 10240';-- MB-- 启用 QNodeCREATEQNODEONDNODE3;SHOWQNODES;

性能考量

影响查询性能的关键因素

因素影响建议
WHERE 时间范围决定扫描 File Set 数总是带时间条件
Tag 过滤选择性决定参与子表数高基数 Tag 优先
SELECT 列数决定解压列数只选需要的列
GROUP BY 基数决定中间结果大小避免在大基数 Tag 上 GROUP
并发查询数决定线程争抢通过 QNode 隔离重查询

典型查询延迟参考

查询类型数据规模延迟
LAST() 缓存命中任意< 1ms
单子表点查(带 ts)1 天数据1~10ms
单超级表聚合1 万子表 × 1 小时50~500ms
跨 VGroup GROUP BY100 万子表 × 1 天1~10s
大范围 JOIN视数据量秒~分钟级

FAQ

Q1: 为什么 SELECT * 比 SELECT col1 慢很多?

列式存储下每列独立压缩。SELECT *需要解压所有列并重组为行。如果表有 100 列但只关心 1 列,可减少约 99% 的解压和 I/O。

Q2: WHERE 不带时间条件会怎样?

会扫描所有 File Set(可能数十到数百个文件)。在 TB 级数据上可能持续数分钟。生产环境务必带时间条件

Q3: QNode 是必须的吗?

不是必须。小集群可不部署 QNode,VNode 既存储又计算。当:

  • 查询并发高且影响写入
  • 集群有大量复杂分析查询
  • 希望独立扩展查询能力

建议部署 QNode。

Q4: 查询是按行还是按列执行?

按列。算子之间传递的是列式 DataBlock(每列一个独立数组)。这与 ClickHouse 等列式 OLAP 引擎类似,能高效利用 SIMD 和缓存。

参考

系统构架篇

  • 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 数据修复与迁移》

关于 TDengine

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

http://www.zskr.cn/news/1489029.html

相关文章:

  • 从单目视觉到VIO:重投影误差如何成为多传感器融合的‘粘合剂’?
  • 深度评测 | 北京陪诊公司服务横评:8大品牌真实体验对比(2026年6月最新) - 北京陪诊公司
  • 2026 太原防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南 - 宅安选房屋修缮
  • 上海防水补漏哪家靠谱?2026正规修缮公司排名实测 - 苏易修缮
  • Kotlin 协程设计思想(八):suspend 到底是什么?为什么 suspend 不是开启协程?
  • Vivado异步FIFO IP核仿真全流程:从Testbench编写到关键信号(wr_rst_busy)行为解析
  • 基于S08PB16的BLDC电机速度测量与FreeMASTER调试实战
  • Claude Code 的工具延迟加载机制
  • 三阳路空调维修|三阳路空调移机|三阳路空调加氟|三阳路空调回收 高性价比宅到家快速上门 - 武汉宅到家
  • 任何商业行为都要 问这几个问题 ,凭什么轮到你
  • 天赐范式第67天:三分子悬赏令·最终版声明——如果天赐范式没有与之相对应的工程,那我筛选出来的悬赏分子又算什么呢?
  • GEO优化公司避坑指南:2026五强靠谱服务商最新全解析 - GEO优化
  • W55RP20-EVB-MKR 模块 MicroPython 实战 (11):HTTP 协议与 OneNET 平台数据上云
  • 100、安全机制:地理围栏与限高限速
  • NOVELLUS SYSTEMS YSC-BSA01038PLOS / 02-294832-00
  • 串口空闲中断使能到串口空闲中断建立需要多长时间
  • 2026年 IGBT模块、功率模块、可控硅、二极管、整流桥、晶闸管厂家推荐排行榜:高性能与稳定品质之选 - 品牌发掘
  • 革命性微信聊天记录永久保存与智能分析工具:掌握你的数字记忆主权
  • Bilibili 视频合集时长计算最新脚本
  • 思维链 ,Anthropic Mythos模型的 Looped Transformer架构解析,claud为什么厉害性能优越的研究
  • C语言容器中数据的高效串行化和解串--下位机的C语言处理(1)
  • AI Agent 学习指南
  • AMHS自动物料搬运系统实战
  • 2026 泉州防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南 - 宅安选房屋修缮
  • 深度测评 | 怎么判断一家竹笋干供应商是否专业?只看产品种类多不多吗?
  • 汽车以太网PHY芯片TJA1102A硬件配置、寄存器驱动与睡眠唤醒实战指南
  • 如何配置WarcraftHelper解决魔兽争霸III现代系统兼容性问题
  • 2026年杭州企业家必读:GEO优化公司选型实战指南与五大厂商深度横评 - 品牌报告
  • JoyAI-Echo:长音视频生成的真正难点,不是把视频做长,而是让世界不断线
  • uni-app扫码工具包:前后置摄像头自由切换,一套代码跑通H5、小程序和App