ResultSet.next() 非常慢

ResultSet.next() 非常慢

今天遇到一个问题, java中执行ResultSet.next() 非常慢。

详细情况

SQL语句如下

select * from (
    select * from (
     a
     union all
     b
    ) order by xxx
) where rownum < 100    

其中a和b是两个子查询。

Java代码如下

ResultSet rs = (ResultSet) cs.getObject(1);
assertTrue(rs.next()); // 执行到这里卡住

查找原因

sql执行很快,结果集也很小,不知道原因。
baidu找到了类似的情况:http://www.mamicode.com/info-detail-1876584.html
觉得很有道理,于是检查sql语句。

把a部分拿出来检索,结果有十多条,速度很快。
把b部分拿出来检索,一看吓一跳,上百万件结果。难道是这个原因?按理说不应该啊,外部sql语句中已经限制了结果集件数了啊。

临时对策

把a部分和b部分的检索都加上排序和件数限制。
重新编译执行,速度没问题了。

SQL语句

select * from (
    select * from (
         select * from (a order by xxx) where rownum < 100
         union all
         select * from (b order by xxx) where rownum < 100
    ) order by xxx
) where rownum < 100

管不了那么多了,先把手头问题解决了,具体原因有空再查。
PS:有知道的同学,请不吝赐教。

追记

问题原因:SQL写的不好。
union all的子句的数据量非常大,union之后再进行排序取数据,速度慢。在union子句内部进行排序,刚好排序字段在索引字段上,能够利用索引,自然速度非常快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值