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性能急剧下降。。。这次优化就是人工的把查询条件推入内层查询

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值