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