SQL优化实战:外层查询条件放到内层查询中(predicate push down)

 

客户反应考勤sql查询太慢,需要优化。

这个查询是客户用来考核他们员工的考勤的,所以会经常去查,另外,原始语句比较复杂,这个sql一共92行,涉及到6个表的多次关联,客户在查询1个月的数据,基本上要10分钟。

接下来做了如下尝试:
1、原始数据本来从实时表取,修改为从结存表取,减少表的关联,但是修改后速度没有变快。

2、这种情况下很难优化,时间有紧,不可能重新写,因为这样会引入新的问题,还需要进一步测试。

3、考虑到最后返回的数据只有几万条,但是客户在大部分的时候,只是查询一个月中的 某些人员的数据(人员是一个查询条件) ,而不会查询1个月的所有数据。


根据上面的第3点,采用了如下的优化方法:

通过把查询条件直接加入到最内存的sql中,而不是由系统在sql语句的最外层加上查询条件,虽然查询整个月的数据,并没有加快速度,但是单独查询部分数据,速度提高到了10秒以内。

总结:
这次优化,并没有修改语句,而是考虑到要快,就要用条件去直接过滤数据,产生小的结果集,然后这个结果集继续和外层的表关联。

本来,把查询条件写在最外层,可以通过优化器的谓词推入(predicate push down),也就是把外层的查询条件,放到内层查询中,但是有的时候,由于sql非常复杂,优化器无法对sql做这种查询转换(query transform),所以导致sql性能急剧下降。。。这次优化就是人工的把查询条件推入内层查询


 

posted @ 2016-05-09 14:14  小木瓜瓜瓜  阅读(342)  评论(0编辑  收藏  举报