【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境
【TDengine 版本】
3.3.6.13
【操作系统以及版本】
linux centos
【部署方式】容器/非容器部署
非容器部署
【集群节点数】
1
【集群副本数】
【描述业务影响】
查询速度慢
【问题复现路径/shan】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
问个读取速度优化的问题。底下图片里面 union all 高并发查询速度不是很快,换成in速度更慢,tdengine单机有没有优化的方法?
读目前是瓶颈。写挺快, 这种union all 的读取 貌似比influxdb慢很多。 32核服务器。每次最多限制查询 union all 30个channelid. 数量多目前分批次查询
【资源配置】
【报错完整截图】(不要大段的粘贴报错代码,论坛直接看报错代码不直观)
channelId 是 tag? 把超级表的表结构贴一下。
另外这个超级表有多少子表?数据量多大?
channelId 是tag
表结构:
Create STable HisData (Time timestamp, Data double, CState int) TAGS (ChannelId BIGINT) ;
存1年过期的库的表 表数量 的大概400亿
还有这种时间等于的 union all 并发量大了也比较慢。单次查询不慢。但是influxdb可以一次查几百个channelid所以块。 tdengine限制30个一次查询是最快的了,限制太多或者太少都没30个快。 目前用的原生查询 或者 taosadpter 执行这些sql 并发后速度都一般
400亿是这个超级表总的数据条数吧? 总共有多少子表?
select * from ( select * from DailyData where ChannelId = 19452815 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452743 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19471636 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452743 and time = ‘2025-10-13 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452815 and time = ‘2025-10-13 00:00:00.000000’ union all select * from DailyData where ChannelId = 19471636 and time = ‘2025-10-13 00:00:00.000000’ ) limit 1000000
这种时间等于的 unionall 并发也不快
select * from ( select * from DailyData where ChannelId = 19452815 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452743 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19471636 and time = ‘2025-10-12 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452743 and time = ‘2025-10-13 00:00:00.000000’ union all select * from DailyData where ChannelId = 19452815 and time = ‘2025-10-13 00:00:00.000000’ union all select * from DailyData where ChannelId = 19471636 and time = ‘2025-10-13 00:00:00.000000’ ) limit 1000000
select * from DailyData where ChannelId = 19452815。这个查询优化成直接查子表呢? 你如果知道这个 Channelld 对应的子表名的话。
show vnodes 命令显示34行, 应该是34个
之前回答错了 子表 有 16575086个 不是60万个
use 一下这个库,然后 show vgroups 看看有几行,就是这个库有几个vnode
这个 vnode 个数 太少了,你的子表有1600w,分配到18个vnode上,一个vnode 将近 100w 子表。会导致查询性能不好。
你可以扩充vnode,每个vnode 最多子表个数不要超过50w。你可以扩充 vnode 个数到 100个。
你的机器性能如何? 内存,cpu?
通过 split vgroup <vgroup_id> 命令可以分裂 vnode,把 vnode 个数扩充一下 ( 集群维护 | TDengine 文档 | 涛思数据
SupportVnodes 分裂过程中可能报错,可以把这个参数先改大( taosd 参考手册 | TDengine 文档 | 涛思数据
numOfVnodeQueryThreads 还有这个参数是查询线程数,默认核数的两倍,可以设置成4倍试试。
这些参数具体说明 官网有
可以直接更改库的VGROUPS参数吗?还是一定要split; 我是根据cpu32核心 32个VGROUPS 分给多个库。 这个查询比较频繁的库给了9个。那1600万个子表我直接单机这个库vgroup改成100个? 如果一个电脑vgroup是cpu的两三倍甚至七八倍有没有关系?
官网对split参数说明:单副本库虚拟组,在分裂完成后,历史时序数据总磁盘空间使用量,可能会翻倍。所以,在执行该操作之前,通过增加 dnode 节点方式,确保集群中有足够的 CPU 和磁盘资源,避免资源不足现象发生 ; 那是不是要有原来数据起码两倍以上的磁盘空间?磁盘目前不是很够。
语句没有优化空间了是吗。
是的,目前只有 split 一种方式可以扩展 vgroups。
查询优化之前提到可以设置
numOfVnodeQueryThreads 还有这个参数是查询线程数,默认核数的两倍,可以设置成4倍试试。