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

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于JPA2CriteriaBuilder查询多组条件or与and组合的问题,可以使用Predicate进行解决。Predicate是一种用于构建Criteria查询条件接口,可以创建多组条件并且可以使用and和or进行组合。 示例代码如下: ``` CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<Entity> query = builder.createQuery(Entity.class); Root<Entity> root = query.from(Entity.class); Predicate predicate1 = builder.and( builder.equal(root.get("field1"), value1), builder.equal(root.get("field2"), value2) ); Predicate predicate2 = builder.or( builder.equal(root.get("field3"), value3), builder.equal(root.get("field4"), value4) ); query.where(builder.and(predicate1, predicate2)); List<Entity> result = entityManager.createQuery(query).getResultList(); ``` 在上述代码,我们首先创建了一个CriteriaBuilder对象和一个CriteriaQuery对象,然后使用from方法创建一个Root对象,用于指定查询的实体类。 接着,我们使用and方法创建了一个包含两个条件Predicate对象,其包含了两个属性field1和field2分别与value1和value2进行比较的条件。 然后,我们使用or方法创建了一个包含两个条件Predicate对象,其包含了两个属性field3和field4分别与value3和value4进行比较的条件。 最后,我们使用where方法将这两个Predicate对象组合成一个条件,并且使用createQuery方法执行查询,并将结果存储在一个List对象。 通过这种方式,我们就可以使用JPA2的CriteriaBuilder查询多组条件or与and组合的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值