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


  • 相关阅读:
    使用尾递归对斐波那契优化?
    Ajax是什么?包含什么技术?有什么作用?
    Ajax的乱码解决问题?
    Ajax的核心的对象是什么?
    为什么Java中不支持多重继承?
    vue-router的原理,例如hashhistory和History interface?
    JSP是什么?有什么特点?
    forward 和redirect的区别?
    Listener是什么?有什么作用?
    请说一说Servlet的生命周期?
  • 原文地址:https://www.cnblogs.com/momogua/p/8304443.html
Copyright © 2011-2022 走看看