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就不会导致执行效率降低了。