【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境
【TDengine 版本】3.8.8.4
【操作系统以及版本】linux
【部署方式】非容器部署
【集群节点数】3
【集群副本数】3
【描述业务影响】查询性能跟不上
【问题复现路径/shan】
【遇到的问题:问题现象及影响】400万点位从别的数据库批量导入后(连续10万条),查询很快,但是实际采集的数据每分钟上送一条插入到数据库后,查询非常慢,需要7秒钟
【资源配置】16C 32G
【报错完整截图】(不要大段的粘贴报错代码,论坛直接看报错代码不直观)

select * from rtd where ts>’2025-11-29 11:00:00’ and ts <‘2025-11-30 11:00:00‘ and join_code =’4611688389249335296-ai_sum’ limit 10;
语句在首次查询的时候非常慢,首次之后很快
注:join_code 是首个tag 有索引
我的理解是实际是我数据按分钟上送,400万点位的存储每个测量点的数据不在一块的,文件快太多
klxu
(klxu)
4
每个 vgroup 子表有多少?如果单个 vgroup 子表太多,那么每次落盘时,有可能产生很多 stt 文件,则会影响查询速度。 另外,stt_trigger 16,也有可能造成 stt 文件数量较多。建议:1)减少单个 vgroup 子表的数量,例如,10 万个。另外,加大 buffer 参数(内存中的数据达到 buffer 的 1/3 时开始落盘)增加落盘时数据写入 .data 文件的概率,减少 stt 文件。计算规则参照:落盘时,一个子表的数据行数 > minRows 时,会写入 .data,否则,会在 .stt 文件中,这样查询就会较慢。
我看官网上多表少频率建议调大文件stt参数,故我设置的是16,目前我是32vnode 平均下一个也就10几多万,查询性能远达不到秒级。
如果我设置100条就落盘成data文件 我一个测点一天有1440条数据,是否意味一个测点的head文件的索引有15个,一个vnode假设有10万测点是否意味着有150的索引,如果查询一个月的数据是否就是4500的索引,所以rowmins 在我这个级别设置多少合适,还有我们的规划是希望能承载1000万测点的
klxu
(klxu)
6
1)举个例子说明一下,目前 vnode 的 buffer 是 256 MB,内存中缓存的数据达到 1/3 buffer 即落盘。如果是 10 万个子表,并且假设每个子表的写入频率相近,则每个子表在落盘时平均占用空间为 256MB/3/10W= 895 字节,再除以 minRows 100,平均每行数据为 8.95 个字节,估计每一行数据都会大于该数值。也就是说,每次落盘时,大部分表的行数都 < 100,因此,会落入 stt 文件。而 stt_trigger 为 16,则有可能存在 很多 数据在 stt 文件中。
2)找一个 vnode 发一下文件分布看下吧,vnode/vnode?/tsdb/*
sst 文件有4361个 确实比较多,这样的话是否调整buffer 能够更好的写入,数据整合成data文件是否查询性能能够提升?能否调整buffer 让他达到三分之二落盘不然很多内存都浪费了
我以前的数据(例如11月份的数据)也有很多的stt,为什么,按理说他们早该达到100条了,我的理解是假设这个时间分片中 一共5千条数据,最大4096 留下了4条在这个时间段内再也不能达到最小100条,就会一直在stt 文件中,这种情况(以前的数据也有stt)怎么解决呢
Roy
(Roy)
10
可以执行这个命令来查看存储的分别:
show table distributed dbName.stableName\G;