客户反应考勤sql查询太慢,需要优化。
这个查询是客户用来考核他们员工的考勤的,所以会经常去查,另外,原始语句比较复杂,这个sql一共92行,涉及到6个表的多次关联,客户在查询1个月的数据,基本上要10分钟。
接下来做了如下尝试:
1、原始数据本来从实时表取,修改为从结存表取,减少表的关联,但是修改后速度没有变快。
2、这种情况下很难优化,时间又紧,不可能重新写,因为这样会引入新的问题,还需要进一步测试。
3、考虑到最后返回的数据只有几万条,但是客户在大部分的时候,只是查询一个月中的 某些人员的数据(人员是一个查询条件) ,而不会查询1个月的所有数据。
根据上面的第3点,采用了如下的优化方法:
通过把查询条件直接加入到最内层的sql中,而不是由系统在sql语句的最外层加上查询条件,虽然查询整个月的数据,并没有加快速度,但是单独查询部分数据,速度提高到了10秒以内。
总结:
这次优化,并没有修改语句,而是考虑到要快,就要用条件去直接过滤数据,产生小的结果集,然后这个结果集继续和外层的表关联。
本来,把查询条件写在最外层,可以通过优化器的谓词推入(predicate push down),也就是把外层的查询条件,放到内层查询中,但是有的时候,由于sql非常复杂,优化器无法对sql做这种查询转换(query transform),所以导致sql性能急剧下降。。。这次优化就是人工的把查询条件推入内层查询