V2EX 11月08日 09:48
TimescaleDB 传感器数据查询优化建议
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文讨论了在使用TimescaleDB存储大量传感器二进制数据时遇到的查询性能问题。用户创建了一个包含时间戳(ts)、传感器ID(sensor_id)和数据(data)的表,并利用TimescaleDB的hypertable特性进行优化。然而,在执行按传感器ID和时间范围搜索记录时,查询优化器默认优先使用时间索引(ts_idx),然后在筛选传感器ID,导致效率低下且锁占用过多,影响日常使用。文章寻求解决此类查询性能瓶颈的有效方法,特别是如何让优化器优先考虑传感器ID进行筛选。

📊 **TimescaleDB 数据模型与查询痛点**:用户使用 TimescaleDB 存储约100个音频传感器的数据,日增约十万行。核心问题在于,当需要查询特定传感器在特定时间段内的记录时,TimescaleDB 的查询优化器倾向于先扫描时间索引(ts_idx),再根据传感器ID进行过滤。这种策略不仅效率低下,而且在处理大量数据时,对时间索引的频繁访问会导致过多的锁占用,进而引发日常使用中的报错。

💡 **优化器行为与期望的查询逻辑**:当前优化器的执行计划显示,它首先基于时间范围(ts)在分块(chunk)上进行索引扫描,然后应用传感器ID(sensor_id)作为过滤条件。用户认为,逻辑上更优的策略应该是先根据传感器ID进行定位,再在该传感器的数据范围内查找时间戳,这样可以大大缩小扫描范围,提高查询效率并减少锁的争用。

🚀 **TimescaleDB 性能调优方向**:文章的核心诉求是寻求解决 TimescaleDB 查询性能瓶颈的有效方法。用户希望能够调整 TimescaleDB 的配置或查询策略,使其能够根据传感器ID(sensor_id)优先进行数据筛选,而不是默认依赖时间戳(ts)的索引。这可能涉及到对索引策略、分区设置或查询语句本身的优化,以达到更高效的数据检索和更低的系统资源占用。

如题,新手接触 TimescaleDB ,目前是用这套方案做了一套存音频传感器的数据的工具,大概有 100 个左右的传感器,存二进制数据,日增大概十万行左右。

目前遇到比较大一个问题是,常见的搜索场景是“搜索传感器 A 在某月某日到某月某日期间的所有记录”。但是目前搜索优化器是先从时间的总序列开始查,然后再筛选其中的 A 传感器。而我觉得逻辑上显然是先搜索 A 传感器再筛选时间更优。

前者不光是慢的问题,而且现在有个大问题是走时间索引的话,每个操作占用锁的数量太多了,就算把参数调大了,日常使用也经常报错

问下万能的 v2 ,有什么办法解决吗?

附:创建表的命令:

CREATE TABLE sensor_data (    ts          TIMESTAMPTZ       NOT NULL,    sensor_id   INTEGER           NOT NULL,    data        VARCHAR(64)       NOT NULL,    PRIMARY KEY (sensor_id, ts));SELECT create_hypertable(    'sensor_data',    'ts',    partitioning_column => 'sensor_id',    number_partitions => 16,      chunk_time_interval => INTERVAL '7 day' );

解释搜索命令得到如下结果:

EXPLAIN (ANALYZE, BUFFERS)SELECT * FROM sensor_dataWHERE sensor_id = '001'  AND ts >= '2024-12-06 00:00:00+08'::timestamptz  AND ts <  '2024-12-07 00:00:00+08'::timestamptz;                                                                           QUERY PLAN                                                                             ------------------------------------------------------------------------------------------------------------------------------------------------------------------- Index Scan using _hyper_3_23024_chunk_sensor_data_ts_idx on _hyper_3_23024_chunk  (cost=0.28..6.71 rows=144 width=45) (actual time=0.032..0.062 rows=144 loops=1)   Index Cond: ((ts >= '2024-12-06 00:00:00+08'::timestamp with time zone) AND (ts < '2024-12-07 00:00:00+08'::timestamp with time zone))   Filter: (sensor_id = 1)   Buffers: shared hit=6 Planning:   Buffers: shared hit=1076 read=1 Planning Time: 7.689 ms Execution Time: 11.201 ms(8 rows)

如各位所见的就是不管怎么调,一开始都是走 ts_idx 索引,然后再 filter sensor_id

感觉 timescaleDB 是个好东西,但是这个问题卡住完全没法用啊。拜谢各位

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

TimescaleDB 数据库优化 传感器数据 查询性能 索引 SQL 数据库调优
相关文章