TDengine 查询引擎设计
简介
TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和 mnode 之间的紧密协作。在一个复杂的超级表聚合查询场景中,可能需要多个 vnode 和 qnode 共同承担查询和计算的职责。关于 vnode、qnode、mnode 的定义和介绍,请参考 整体架构
各模块在查询计算中的职责
taosc
taosc 负责解析和执行 SQL。对于 insert 类型的 SQL,taosc 采用流式读取解析策略,以提高处理效率。而对于其他类型的 SQL,taosc 首先使用语法解析器将其分解为抽象语法树(Abstract Syntax Tree,AST),在解析过程中对 SQL 进行初步的语法校验。如果发现语法错误,taosc 会直接返回错误信息,并附上错误的具体位置,以帮助用户快速定位和修复问题。
解析完成的 AST 被进一步转换为逻辑查询计划,逻辑查询计划经过优化后进一步转换为物理查询计划。接着,taosc 的调度器将物理查询计划转换为查询执行的任务,并将任务发送到选定的 vnode 或 qnode 执行。在得到查询结果准备好的通知后,taosc 将查询结果从相应的 vnode 或 qnode 取回,最终返回给用户。
taosc 的执行过程可以简要总结为:解析 SQL 为 AST,生成逻辑查询计划并优化后转为物理查询计划,调度查询任务到 vnode 或 qnode 执行,获取查询结果。
mnode
在 TDengine 集群中,超级表的信息和元数据库的基础信息都得到妥善管理。mnode 作为元数据服务器,负责响应 taosc 的元数据查询请求。当 taosc 需要获取 vgroup 等元数据信息时,它会向 mnode 发送请求。mnode 在收到请求后,会迅速返回所需的信息,确保 taosc 能够顺利执行其操作。
此外,mnode 还负责接收 taosc 发送的心跳信息。这些心跳信息有助于维持 taosc 与 mnode 之间的连接状态,确保两者之间的通信畅通无阻。
vnode
在 TDengine 集群中,vnode 作为虚拟节点,扮演着关键的角色。它通过任务队列的方式接收来自物理节点分发的查询请求,并执行相应的查询处理过程。每个 vnode 都拥
有独立的任务队列,用于管理和调度查询请求。
当 vnode 收到查询请求时,它会从任务队列中取出请求,并进行处理。处理完成后,vnode 会将查询结果返回给下级物理节点中处于阻塞状态的查询队列工作线程,或者是直接返回给 taosc。
执行器
执行器模块负责实现各种查询算子,这些算子通过调用 TSDB 的数据读取 API 来读取数据内容。数据内容以数据块的形式返回给执行器模块。TSDB 是一个时序数据库,负责从内存或硬盘中读取所需的信息,包括数据块、数据块元数据、数据块统计数据等多种类型的信息。
TSDB 屏蔽了下层存储层(硬盘和内存缓冲区)的实现细节和机制,使得执行器模块可以专注于面向列模式的数据块进行查询处理。这种设计使得执行器模块能够高效地处理各种查询请求,同时简化数据访问和管理的复杂性。
UDF Daemon
在分布式数据库系统中,执行 UDF 的计算节点负责处理涉及 UDF 的查询请求。当查询中使用了 UDF 时,查询模块会负责调度 UDF Daemon 完成对 UDF 的计算,并获取
计算结果。
UDF Daemon 是一个独立的计算组件,负责执行用户自定义的函数。它可以处理各种类型的数据,包括时序数据、表格数据等。通过将 UDF 的计算任务分发给 UDF Daemon,查询模块能够将计算负载从主查询处理流程中分离出来,提高系统的整体性能和可扩展性。
在执行 UDF 的过程中,查询模块会与 UDF Daemon 紧密协作,确保计算任务的正确执行和结果的及时返回。
查询策略
为了更好地满足用户的需求,TDengine 集群提供了查询策略配置项 queryPolicy,以便用户根据自己的需求选择查询执行框架。这个配置项位于 taosc 的配置文件,每个配置项仅对单个 taosc 有效,可以在一个集群的不同 taosc 中混合使用不同的策略。
queryPolicy 的值及其含义如下。
- 1:表示所有查询只使用 vnode(默认值)。
- 2:表示混合使用 vnode/qnode(混合模式)。
- 3:表示查询中除了扫表功能使用 vnode 以外,其他查询计算功能只使用 qnode。
- 4:表示使用客户端聚合模式。
通过选择合适的查询策略,用户可以灵活地分配控制查询资源在不同节点的占用情况,从而实现存算分离、追求极致性能等目的。
SQL 说明
TDengine 通过采用 SQL 作为查询语言,显著降低了用户的学习成本。在遵循标准 SQL 的基础上,结合时序数据库的特点进行了一系列扩展,以更好地支持时序数据库的特色查询需求。
- 分组功能扩展:TDengine 对标准 SQL 的分组功能进行了扩展,引入了 partition by 子句。用户可以根据自定义维度对输入数据进行切分,并在每个分组内进行任意
形式的查询运算,如常量、聚合、标量、表达式等。 - 限制功能扩展:针对分组查询中存在输出个数限制的需求,TDengine 引入了 slimit 和 soffset 子句,用于限制分组个数。当 limit 与 partition by 子句共用时,其含义转换为分组内的输出限制,而非全局限制。
- 标签查询支持:TDengine 扩展支持了标签查询。标签作为子表属性,可以在查询中作为子表的伪列使用。针对仅查询标签列而不关注时序数据的场景,TDengine 引入了标签关键字加速查询,避免了对时序数据的扫描。
- 窗口查询支持:TDengine 支持多种窗口查询,包括时间窗口、状态窗口、会话窗口、事件窗口、计数窗口等。未来还将支持用户自定义的更灵活的窗口查询。
- 关联查询扩展:除了传统的 Inner、Outer、Semi、Anti-Semi Join 以外,TDengine 还支持时序数据库中特有的 ASOF Join 和 Window Join。这些扩展使得用户可以更加方便灵活地进行所需的关联查询。
查询流程
完整的查询流程如下。
- 第 1 步,taosc 解析 SQL 并生成 AST。元数据管理模块(Catalog)根据需要向 vnode 或 mnode 请求查询中指定表的元数据信息。然后,根据元数据信息对其进行权限检查、语法校验和合法性校验。
- 第 2 步,完成合法性校验之后生成逻辑查询计划。依次应用全部的优化策略,扫描执行计划,进行执行计划的改写和优化。根据元数据信息中的 vgroup 数量和 qnode 数量信息,基于逻辑查询计划生成相应的物理查询计划。
- 第 3 步,客户端内的查询调度器开始进行任务调度处理。一个查询子任务会根据其数据亲缘关系或负载信息调度到某个 vnode 或 qnode 所属的 dnode 进行处理。
- 第 4 步,dnode 接收到查询任务后,识别出该查询请求指向的 vnode 或 qnode,将消息转发到 vnode 或 qnode 的查询执行队列。
- 第 5 步,vnode 或 qnode 的查询执行线程从查询队列获得任务信息,建立基础的查询执行环境,并立即执行该查询。在得到部分可获取的查询结果后,通知客户端调度器。
- 第 6 步,客户端调度器依照执行计划依次完成所有任务的调度。在用户 API 的驱动下,向最上游算子所在的查询执行节点发送数据获取请求,读取数据请求结果。
- 第 7 步,算子依据其父子关系依次从下游算子获取数据并返回。
- 第 8 步,taosc 将所有获取的查询结果返回给上层应用程序。
多表聚合查询流程
TDengine 为了解决实际应用中对不同数据采集点数据进行高效聚合的问题,引入了超级表的概念。超级表是一种特殊的表结构,用于代表一类具有相同数据模式的数据采集点。超级表实际上是一个包含多张表的表集合,每张表都具有相同的字段定义,但每张表都带有独特的静态标签。这些标签可以有多个,并且可以随时增加、删除和修改。
通过超级表,应用程序可以通过指定标签的过滤条件,轻松地对一个超级表下的全部或部分表进行聚合或统计操作。这种设计大大简化了应用程序的开发过程,提高了数据处理的效率和灵活性。TDengine 的多表聚合查询流程如下图所示:

具体步骤说明如下。
- 第 1 步,taosc 从 mnode 获取库和表的元数据信息。
- 第 2 步,mnode 返回请求的元数据信息。
- 第 3 步,taosc 向超级表所属的每个 vnode 发送查询请求。
- 第 4 步,vnode 启动本地查询,在获得查询结果后返回查询响应。
- 第 5 步,taosc 向聚合节点(在本例中为 qnode)发送查询请求。
- 第 6 步,qnode 向每个 vnode 节点发送数据请求消息来拉取数据。
- 第 7 步,vnode 返回本节点的查询计算结果。
- 第 8 步,qnode 完成多节点数据聚合后将最终查询结果返回给客户端。
TDengine 为了提升聚合计算速度,在 vnode 内实现了标签数据与时序数据的分离存储。首先,系统会在内存中过滤标签数据,以确定需要参与聚合操作的表的集合。这样做可以显著减少需要扫描的数据集,从而大幅提高聚合计算的速度。
此外,得益于数据分布在多个 vnode 中,聚合计算操作可以在多个 vnode 中并发进行。这种分布式处理方式进一步提高了聚合的速度,使得 TDengine 能够更高效地处理大规模时序数据。
值得注意的是,对普通表的聚合查询以及绝大部分操作同样适用于超级表,且语法完全一致。具体请查询参考手册。
查询缓存
为了提升查询和计算的效率,缓存技术在其中扮演着至关重要的角色。TDengine 在查询和计算的整个过程中充分利用了缓存技术,以优化系统性能。
在 TDengine 中,缓存被广泛应用于各个阶段,包括数据存储、查询优化、执行计划生成以及数据检索等。通过缓存热点数据和计算结果,TDengine 能够显著减少对底层存储系统的访问次数,降低计算开销,从而提高整体查询和计算效率。
此外,TDengine 的缓存机制还具备智能化的特点,能够根据数据访问模式和系统负载情况动态调整缓存策略。这使得 TDengine 在面对复杂多变的查询需求时,仍能保持良好的性能表现。
缓存的数据类型
缓存的数据类型分为如下 4 种。
- 元数据(database、table meta、stable vgroup)。
- 连接数据(rpc session、http session)。
- 时序数据(buffer pool、multilevel storage)。
- 最新数据(last、last_row)。
缓存方案
TDengine 针对不同类型的缓存对象采用了相应的缓存管理策略。对于元数据、RPC 对象和查询对象,TDengine 采用了哈希缓存的方式进行管理。这种缓存管理方式通过一个列表来管理,列表中的每个元素都是一个缓存结构,包含了缓存信息、哈希表、垃圾回收链表、统计信息、锁和刷新频率等关键信息。
为了确保缓存的有效性和系统性能,TDengine 还通过刷新线程定时检测缓存列表中的过期数据,并将过期数据删除。这种定期清理机制有助于避免缓存中存储过多无用数据,降低系统资源消耗,同时保持缓存数据的实时性和准确性。缓存方案下图所示:

- 元数据缓存(meta data):包括数据库、超级表、用户、节点、视图、虚拟节点等信息,以及表的 schema 和其所在虚拟节点的映射关系。通过在 taosc 缓存元数据可以避免频繁地向 mnode/vnode 请求元数据。taosc 对元数据的缓存采用固定大小的缓存空间,先到先得,直到缓存空间用完。当缓存空间用完时,缓存会被进行部分淘汰处理,用来缓存新进请求所需要的元数据。
- 时序数据缓存(time series data):时序数据首先被缓存在 vnode 的内存中,以 skipList 形式组织,当达到落盘条件后,将时序数据进行压缩,写入数据存储文件
中,并从缓存中清除。 - 最新数据缓存(last/last_row):对时序数据中的最新数据进行缓存,可以提高最新数据的查询效率。最新数据以子表为单元组织成 KV 形式,其中,K 是子表 ID,V 是该子表中每列的最后一个非 NULL 以及最新的一行数据。
访问官网
更多内容欢迎访问 TDengine 官网
相关文章:
TDengine 查询引擎设计
简介 TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…...
AOSP Android14 Launcher3——点击桌面图标启动应用动画流程
在Launcher3中,点击桌面应用图标时,会有一个从 图标位置起始到全屏的动画过程,使得应用的打开过程不是生硬的启动过程。 这个动画具体是怎么实现的呢?本文对这个过程进行一个梳理 在Launcher中,动画大体上可以分为两类…...
windows端远程控制ubuntu运行脚本程序并转发ubuntu端脚本输出的网页
背景 对于一些只能在ubuntu上运行的脚本,并且这个脚本会在ubuntu上通过网页展示运行结果。我们希望可以使用windows远程操控ubuntu,在windows上查看网页内容。 方法 start cmd.exe /k "sshpass -p passwd ssh namexxx.xxx.xxx.xxx "cd /hom…...
【官方正版,永久免费】Adobe Camera Raw 17.2 win/Mac版本 配合Adobe22-25系列软
Adobe Camera Raw 2025 年 2 月版(版本 17.2)。目前为止最新版新版已经更新2个月了,我看论坛之前分享的还是2024版,遂将新版分享给各位。 Adobe Camera Raw,支持Photoshop,lightroom等Adobe系列软件&#…...
如何使用flatten函数在Terraform 中迭代嵌套map
简介 flatten 接受一个列表,并用列表内容的扁平序列替换列表中的任何元素。 > flatten([["a", "b"], [], ["c"]]) ["a", "b", "c"] > flatten([[["a", "b"], []], [&quo…...
原生 HTML 的`title` 属性修改触发事件为鼠标移入移出显示
HTML中title属性的适用范围 在 HTML 中,title 属性是全局属性(Global Attribute),这意味着它可以被应用到所有 HTML 标签上。无论是块级元素(如 <div>)、行内元素(如 <span>),还是表单元素(如 <input>),都可以添加 title 属性。 常见使用 title…...
【论文精读】Reformer:高效Transformer如何突破长序列处理瓶颈?
目录 一、引言:当Transformer遇到长序列瓶颈二、核心技术解析:从暴力计算到智能优化1. 局部敏感哈希注意力(LSH Attention):用“聚类筛选”替代“全量计算”关键步骤:数学优化: 2. 可逆残差网络…...
jmeter中监控服务器ServerAgent
插件下载: 将ServerAgent上传至需要监控的服务器,mac/liunx启动startAgent.sh(启动命令:./startAgent.sh) 在jmeter中添加permon监控组件 配置需要监控的服务器IP地址,添加需要监控的资源 注意…...
网络结构及安全科普
文章目录 终端联网网络硬件基础网络协议示例:用户访问网页 OSI七层模型网络攻击(Hack)网络攻击的主要类别(一)按攻击目标分类(二)按攻击技术分类 网络安全防御 典型攻击案例相关名词介绍网络连接…...
JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查
一、JVM调优的参数在哪里设置 项目开发过程中有以下两种部署项目的方式: 项目部署在tomcat中,是一个war包;项目部署在SpringBoot中,是一个jar包。 (1)war包 catalina文件在Linux系统下的tomcat是以sh结尾,在windows系…...
安全复健|windows常见取证工具
写在前面: 此博客仅用于记录个人学习内容,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除) 取证 01系统运行数据 使用工具:Live-F…...
FPGA开发流程初识
FPGA 的开发流程可知,在 FPGA 开发的过程中会产生很多不同功能的文件,为了方便随时查找到对应文件,所以在开始开发设计之前,我们第一个需要考虑的问题是工程内部各种文件的管理。如 果不进行文件分类,而是将所有文件…...
Docker 中将文件映射到 Linux 宿主机
在 Docker 中,有多种方式可以将文件映射到 Linux 宿主机,以下是常见的几种方法: 使用-v参数• 基本语法:docker run -v [宿主机文件路径]:[容器内文件路径] 容器名称• 示例:docker run -it -v /home/user/myfile.txt:…...
C# 类型、存储和变量(栈和堆)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 栈和堆 程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方…...
基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统
基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】疲劳检测模型与行为分析统计 【技术栈】 ①:系统环境:Windows/Mac/Linux ②:开发环境:P…...
AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...
Linux系统学习----概述与目录结构
linux 是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目 (c/c/php/python/java/go)都会部署到 Linux/unix 系统上。 一、虚拟机系统操作 1.网络连接的三种方式(桥接模式、nat模式、主机模…...
python pdf转图片再OCR
先pdf转图片 import os from pdf2image import convert_from_path# PDF文件路径 pdf_path /Users/xxx/2022.pdf # 输出图片的文件夹 output_folder ./output_images2022 # 输出图片的命名格式 output_name page# 如果输出文件夹不存在,创建它 if not os.path.ex…...
(2)Docker 常用命令
文章目录 Docker 服务器Docker 镜像Docker 容器本地 RegistryRUN vs CMD vs ENTRYPOINTRUNCMDENTRYPOINT 限制容器对内存、CPU 和 IO 资源的使用内存CPUBlock IO设置权重bps 和 iops cgroup 和 namespacecgroupnamespacMount namespaceUTS namespaceIPC namespacePID namespace…...
虚拟列表技术深度解析:原理、实现与性能优化实战
虚拟列表技术深度解析:原理、实现与性能优化实战 引言 在当今数据驱动的互联网应用中,长列表渲染已成为前端开发的核心挑战。传统的一次性全量渲染方式在数据量超过千条时,往往导致页面卡顿、内存飙升等问题。虚拟列表(Virtual L…...
服务器简介(含硬件外观接口介绍)
服务器(Server)是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠,能够长时间无间断运行,支持多个用户或客户端的请求。简单来说,服务器就是专门用来存储、管理和提供数…...
c++下的onnx推理
参考代码:https://github.com/itsnine/yolov5-onnxruntime 参考链接:https://blog.csdn.net/magic_ll/article/details/125517798 1.下载onnx 官网:https://github.com/microsoft/onnxruntime/releases/tag/v1.21.0 2.下载代码 https://g…...
TCP三次握手与四次挥手面试回答版本
面试官:说一下TCP三次握手的过程 参考面试回答: 在第一次握手的时候、客户端会随机生成初始化序号、放到TCP报文头部的序号字段中、同时把SYN标志设置为1 这样就表示SYN报文(这里是请求报文)。客户端将报文放入 TCP 报文首部的序…...
Vue3 使用PrimeVue的面包屑组件Breadcrumb,使用JS滚动进行
做了一个自动添加的面包写导航栏,需要在添加之后自动滚动到最右边,发现常规的滚动方法不行,以下是源码,直接调用ScrollToRight方法就行,最主要的就是在value后面加一个$el: <Breadcrumb :home"hom…...
0101基础知识-区块链-web3
文章目录 1 web3学习路线2 区块链简史2.1 区块链2.2 公共账本2.3 区块链的设计哲学2.3.1 去中心化2.3.2 共识2.3.2.1 上链2.3.2.2 共识算法 3 web3面向资产的互联网3.1 安全性和去中心化的权衡 4 智能合约4.1 以太坊智能合约4.2 去中心化应用 5 小结结语 1 web3学习路线 参考下…...
工作纪实_63-Mac电脑使用brew安装软件
最近在接触kafka,想着在自己的电脑安装一套环境,docker也能行,但是还是想装一些原生的软件试试看,因此便想着整理一下brew的命令,这命令确实是方便,不需要下载tar包乱八七糟的东西,一键安装 bre…...
Cadence学习笔记之---库元件制作、元件放置
目录 01 | 引 言 02 | 环境描述 03 | 工具介绍 04 | 无源器件的制作 05 | IC芯片制作 06 | 放置元件 07 | 结 语 01 | 引 言 在上一篇小记中,讲述使用Cadence创建原理图工程和元件库; 本篇小记主要讲述如何制作常用的库元件,如电阻、…...
服务器如何修复SSL证书错误?
修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案: --- ### **1. 确认错误类型** 首先检查浏览器或工具(如OpenSSL)报错的具体信息,常见错误包括: - **证书过期**…...
图解Mysql原理:深入理解事务的特性以及它的实现机制
前言 大家好,我是程序蛇玩编程。 Mysql中事务大家不陌生吧,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。那它具有哪些特性,如何实现的呢?接着往下看。 正文 事务的特性: 事务的基本特性主要为四种…...
《前端面试题之 Vue 篇(第四集)》
目录 1、Vue 中实现强制刷新2、Vue3 和 Vue2 的区别解析3、 Vue3 性能优于 Vue2 的原因解析4、Vue3 使用 Proxy5、首屏优化6、组件的理解7、vue项目中合理规划文件目录8、Nuxt.js 简单了解9、单页应用10、 SEO 优化 1、Vue 中实现强制刷新 在 Vue 中实现强制刷新的分析如下&am…...
