【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境
【TDengine 版本】3.3.84
【操作系统以及版本】
【部署方式】容器
【集群节点数】
【集群副本数】
【描述业务影响】
【问题复现路径/shan】查询BLOB字段慢,批量则容易崩溃
【遇到的问题:问题现象及影响】
查询包含BLOB字段的数据表时,如果不指定时间查询,会比较慢,批量查询容易爆内存,有什么优化的方法
【资源配置】4核32GB
【报错完整截图】
【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境
【TDengine 版本】3.3.84
【操作系统以及版本】
【部署方式】容器
【集群节点数】
【集群副本数】
【描述业务影响】
【问题复现路径/shan】查询BLOB字段慢,批量则容易崩溃
【遇到的问题:问题现象及影响】
查询包含BLOB字段的数据表时,如果不指定时间查询,会比较慢,批量查询容易爆内存,有什么优化的方法
【资源配置】4核32GB
【报错完整截图】
最主要的优化方法就是增加查询的时间范围,否则全表扫描,数据量大的时候肯定就慢了。
请将 具体的查询 sql 和 对应的 表的 schema 发出来看看。
已经增加了时间范围了
DDL:CREATE TABLE iot_recovery.edge_scheduled_data (
daq_date_time_stamp **TIMESTAMP** **NOT** **NULL**,
sensor_id **VARCHAR**(64),
direction **INT**,
sensor_type **INT**,
daq_date_start_time **VARCHAR**(20),
frequency_4_analysis **INT**,
spectrum_lines **INT**,
block_no **INT**,
point_per_block **INT**,
blocks **INT**,
rms **FLOAT**,
rms_1_6k **FLOAT**,
rms_2_1k **FLOAT**,
max **FLOAT**,
min **FLOAT**,
mean **FLOAT**,
peak **FLOAT**,
peak_to_peak **FLOAT**,
variance **FLOAT**,
average_amplitude **FLOAT**,
square_root_amplitude **FLOAT**,
kurtosis **FLOAT**,
impulse_factor **FLOAT**,
shape_indicator **FLOAT**,
crest_factor **FLOAT**,
margin_index **FLOAT**,
skewness_index **FLOAT**,
vel_rms **FLOAT**,
vel_rms_2_1k **FLOAT**,
vel_peak **FLOAT**,
time_raw_data **BLOB**,
receive_time **TIMESTAMP**,
sensor_code **VARCHAR**(64),
**CONSTRAINT** daq_date_time_stamp **PRIMARY** **KEY** (daq_date_time_stamp)
);
sql: select * from iot_recovery.edge_scheduled_data
where sensor_code = ‘124010125_1_11’ and daq_date_time_stamp > ‘2026-06-30 20:00:00’ limit 50; 这种情况下需要22秒
创建的 普通表表,没有使用超级表模式?
sensor_code = ‘124010125_1_11’ 这种过滤是比较耗时的。
这种建模方式不是很好。对于一些静态变量,应该使用超级表方式建模。这样过滤性能更快。
是超级表,这个code就是tag
上面的CREATE TABLE iot_recovery.edge_scheduled_data …… 不是超级表啊。
执行 : desc iot_recovery.edge_scheduled_data ; 看看有tag 列吗?
请看一下查询计划的情况:
EXPLAIN ANALYZE VERBOSE true select * from iot_recovery.edge_scheduled_data where sensor_code = ‘124010125_1_11’ and daq_date_time_stamp > ‘2026-06-30 20:00:00’ limit 50\G;
注意后面一定加上 \G, 否则信息无法看全。
| col1 | QUERY_PLAN |
|---|---|
| col2 | -> Data Exchange 2:1 (cost=0.020..40.161 rows=50 width=283) |
| col3 | Output: columns=33 width=283 limit=50 |
| col4 | -> Projection (cost=61.307..59.918 rows=50 columns=33 width=283 input_order=asc ) |
| col5 | Output: columns=33 width=283 limit=50 |
| col6 | Output: Ignore Group Id: true |
| col7 | Merge ResBlocks: True |
| col8 | -> Table Scan on edge_scheduled_data (cost=0.000..58.499 rows=50 columns=32 pseudo_columns=1 width=283 order=[asc |
| col9 | I/O: total_blocks=0.5 load_blocks=0.5 load_block_SMAs=0.0 total_rows=25.0 check_rows=77.0 |
| col10 | max_row_task=1, total_rows:50, ep:tbd (cost=0.000..58.499) |
| col11 | Output: columns=33 width=283 limit=50 |
| col12 | Time Range: [1782820800001, 9223372036854775807] |
| col13 | Ratio: 0.001000 |
| col14 | Planning Time: 0.662 ms |
| col15 | Execution Time: 148.035 ms |
加了\G就报错,这是不加的结果 | |