【openGauss、PostgreSQL的SQL优化】多表left join、group by的慢SQL如何优化改造
一、问题描述:多表left join、group by改造
- 现在有一个sql,由一个主表、其他几个从表left join主表,然后有where条件、有group by。
- select后面的字段查询有用到string_agg的开窗函数,现在查询很慢,有4秒多将近5秒的样子。问如何优化?
二、分析SQL
经过分析发现,主表关联到最后一个表的时候,数据量由几千变成了600多万,过滤器过滤这600多万的数据消耗cost太大,出现这种现象的原因是关联字段是一对多的关系。所以SQL里面有group by来分组求和到select的字段里面展示出来。需要在left join的时候,先过滤掉这些数据再left join。即把group by写到left join 从表子查询里面去。
三、解决方案
- “主表” left join “从表” 且含group by 改成 “主表” left join “从表子查询”
3.1、单独查 “主表” left join “从表”。
一层一层的分析,首先,主表left join第一个从表,然后select把主表和第一个从表的字段单独拎出来,把group by的设计的字段也拎出来,单独查或者分析执行计划看慢不慢。