关于集成Hibernate框架时,使用分页查询导致sql变慢的问题。即使用rownum导致sql变慢的情况。

rownum导致sql变慢的情况

前言: 由于问题的发生是伴随着工作中的场景,所以具体sql无法直接复制到帖子里,这里只能描述一下问题和对应的解决方案。

问题: 我们这个项目使用的数据库框架是Hibernate。而在使用这个框架的过程中,我遇见了一个业务场景非常复杂的列表查询sql。当这个sql在单独执行的情况下没有出现卡死的情况,但是一旦进行分页就发现sql执行起来非常的慢。
后来发现是增加了 rownum 条件导致的。

解决方法: 将复杂sql先进行 order by 1 排序

由于是公司业务场景这里无法将复杂sql复现,这里就先举一个简单的例子看一下吧

--执行不出来的sql
select * from (select * from user_table where [一堆复杂条件]) where rownum <= 10
 
--使用order by 优化后的sql
select * from 
(select * from user_table where [一堆复杂条件] order by 1) 
where rownum <= 10 

问题分析: 应该是rownum在使用的过程中,会寻找主键,或其他字段进行内部的排序,从而生成这个rownum进行取值。而在复杂场景中可能是某几条查询条件导致了没有走索引从而进行其他方式排序生成rownum导致执行效率骤降(这个原因我不敢肯定,如果有懂的大佬欢迎评论区指导)。而在使用rownum的时候如果执行效率太低,可以先把业务场景的sql使用order by 的方式进行排序,我这里就order by 1 表示了,可以使用实际字段,根据实际情况选择就行,这样rownum就不会导致执行效率降低了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值