PostgreSQL查询性能优化请求:耗时查询改写建议
PostgreSQL查询优化改写方案
原查询的核心性能瓶颈在于关联子查询,它会对yunm分组后的每一行单独发起一次查询,数据量较大时会显著降低执行效率。以下是最优改写方案及配套优化建议:
改写后的查询语句
SELECT y.fgh_dk, ft.dmb, y.ghk_nm, SUM(y.hjlm_sup) AS mgh_klmno FROM yunm y LEFT JOIN fgh_tonee ft ON ft.id = y.fgh_dk WHERE y.fgh_dk IS NOT NULL GROUP BY y.fgh_dk, y.ghk_nm, ft.dmb ORDER BY y.fgh_dk, y.ghk_nm;
改写说明
- 用
LEFT JOIN替代关联子查询,让数据库可以通过更高效的关联算法(如嵌套循环、哈希连接)一次性完成表关联,避免重复执行子查询。 - 若能确保
yunm表的fgh_dk在fgh_tonee表中都有对应记录,可将LEFT JOIN改为INNER JOIN,进一步提升查询效率。
配套索引优化建议
索引是提升查询性能的关键,针对该查询建议创建以下索引:
- 给
yunm表创建覆盖索引,直接满足分组、过滤和求和需求,避免回表:CREATE INDEX idx_yunm_fghdk_ghknm ON yunm(fgh_dk, ghk_nm) INCLUDE (hjlm_sup); - 确保
fgh_tonee表的id字段有主键或唯一索引(若尚未创建):CREATE UNIQUE INDEX idx_fghtonee_id ON fgh_tonee(id);
内容的提问来源于stack exchange,提问作者sportyrdy
相关产品推荐
相关产品推荐

