我有一个查询(带有子查询),可以计算前几年的平均温度,每天加/减一周。它有效,但并不是那么快。下面的时间序列值只是一个例子。为什么我使用doy
是因为我想在每年的同一日期附近有一个滑动窗口。PostgreSQL优化:日期范围内的平均值
SELECT days,
(SELECT avg(temperature)
FROM temperatures
WHERE site_id = ? AND
extract(doy FROM timestamp) BETWEEN
extract(doy FROM days) - 7 AND extract(doy FROM days) + 7
) AS temperature
FROM generate_series('2017-05-01'::date, '2017-08-31'::date, interval '1 day') days
所以我的问题是,这个查询可以以某种方式改进?我正在考虑使用某种窗口函数,或者可能使用lag
和lead
。但是,至少常规的窗口函数仅适用于特定数量的行,而在两周窗口内可以进行任意数量的测量。
我可以和我现在所拥有的一样,但随着数据量的增长,查询的执行速度也如此。后两个extract
可以被删除,但是没有明显的速度改进,只会使查询不易读。任何帮助将不胜感激。
搜索“优化搜索”,我建议提供现有查询的解释计划术语。 –