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子句内部进行排序,刚好排序字段在索引字段上,能够利用索引,自然速度非常快。

你可能感兴趣的:(编码问题)