我在try 优化这个查询时遇到了困难,我希望你们中的一些数据库专家可能会有一些见解.以下是设置.
使用TimscaleDB作为我的数据库,我有一个包含传感器数据的wide table,如下所示:
time | sensor_id | wind_speed | wind_direction |
---|---|---|---|
'2023-12-18 12:15:00' | '1' | NULL | 176 |
'2023-12-18 12:13:00' | '1' | 4 | 177 |
'2023-12-18 12:11:00' | '1' | 3 | NULL |
'2023-12-18 12:09:00' | '1' | 8 | 179 |
我想要编写一个查询,为我提供一组按sensor_id
筛选的列的最新非空值.对于上述数据(在sensor_id
1上过滤),此查询应返回
wind_speed | wind_direction |
---|---|
4 | 176 |
话虽如此,我的查询看起来像下面这样(当在10个批次中查询sensor_id
个时):
SELECT
(SELECT wind_speed FROM sensor_data WHERE sensor_id = '1' AND "time" > now()-'7 days'::interval AND wind_speed IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_speed,
(SELECT wind_direction FROM sensor_data WHERE sensor_id = '1' AND "time" > now()-'7 days'::interval AND wind_direction IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_direction,
(SELECT wind_speed FROM sensor_data WHERE sensor_id = '2' AND "time" > now()-'7 days'::interval AND wind_speed IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_speed_two,
(SELECT wind_direction FROM sensor_data WHERE sensor_id = '2' AND "time" > now()-'7 days'::interval AND wind_direction IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_direction_two,
.
.
.
(SELECT wind_speed FROM sensor_data WHERE sensor_id = '10' AND "time" > now()-'7 days'::interval AND wind_speed IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_speed_ten,
(SELECT wind_direction FROM sensor_data WHERE sensor_id = '10' AND "time" > now()-'7 days'::interval AND wind_direction IS NOT NULL ORDER BY "time" DESC LIMIT 1) as wind_direction_ten;
我正在查询的表有1,000个唯一的sensor_id
,所有这些都以2 minute为间隔报告数据.第100s of millions of rows章我们在谈
我在(sensor_id, time DESC)
上创建了一个索引,以进一步优化查询.有了索引,这个查询分别花费了大约400ms和50ms的规划和执行时间.
如何以不同方式编写查询(或添加索引)以实现最佳规划和执行时间?