PostgreSQL查询优化:按月统计每日平均价格的性能提升咨询
优化方案
1. 简化查询逻辑,删除不必要的UNION拼接
你当前的写法完全不需要按月份拆分再用UNION拼接,直接一次查询过滤目标时间范围和指定code即可,不仅逻辑更简洁,还能避免多次扫表的开销。
优化后的SQL示例(查询FS-H212020年1月的每日均价,若表中日期字段实际名为period,替换SQL中的date为period即可):
SELECT date AS `date`, code, AVG(price) AS `avg` FROM period_prices WHERE code = 'FS-H21' AND date BETWEEN '2020-01-01' AND '2020-01-31' GROUP BY date, code;
注意:你原来的示例代码中第二个UNION子句错误使用了
avg(closure),属于拆分写多了容易出现的笔误,统一写法后可以避免这类问题。
2. 加覆盖索引大幅提升查询性能
给period_prices表建立联合索引(code, date, price):
CREATE INDEX idx_code_date_price ON period_prices (code, date, price);
这个索引属于覆盖索引,查询时可以直接从索引中拿到所有需要的code、date、price字段,不需要回表查询实际数据行,性能可以提升数倍到数十倍不等。
3. 其他可选优化点
- 如果表数据量极大,已经按日期做了分区,查询时数据库会自动触发分区裁剪,只扫描你指定时间范围内的分区,避免全表扫描
- 如果你因为特殊原因必须拆分月份查询,也请把
UNION换成UNION ALL:UNION会默认对结果集做全局去重,你每个月的日期本身没有重叠,去重完全是无用开销,UNION ALL可以省去这部分耗时
内容的提问来源于stack exchange,提问作者paulogil2010
相关产品推荐
相关产品推荐

