如果 java中执行ResultSet.next() 非常慢。
首先可以肯定的是ResultSet.next() 效率低下是错觉,真正效率低下的是写出SQL的执行速度,同样ResultSet只是代表着结果集,而不表示它就是整个结果集的数据
当出现奇怪的问题的时候,不要这么做:
- 大量重复测试
- 怀疑框架,怀疑Java,怀疑人生
言归正传,首先看一下sql
select * from (
select * from (
a
union all
b
) order by xxx
) where rownum < 100
查找原因
把a部分拿出来检索,结果有十多条,速度很快。
把b部分拿出来检索,上百万件结果。
问题原因:SQL写的不好。
union all的子句的数据量非常大,union之后再进行排序取数据,速度慢。在union子句内部进行排序,刚好排序字段在索引字段上,能够利用索引,自然速度非常快。
注:
1.如果是大量数据情况,可考虑采用分页形式进行查询,这样可以避免内存溢出
2.200万条记录,遍历数据需要30s左右,并行加载,并行之后遍历数据需要25s,基本上没有并行效果
解决方案:
多CPU主机的话,并行机制要能提升效率,主要偏重于CPU密集型操作;
也就是说你的SQL中需要大量的运算,这种情况下可以较好发挥多CPU的优势。
否则服务器磁盘就那么一块,就是个顺序读取文件,跟执行copy没啥本质区别,即便有100个CPU,效果差不多就那样。瓶颈基本就在 网络IO 或 磁盘IO 。
可以把程序直接放在数据库服务器上执行,如果速度大大提升,说明之前瓶颈主要是网络IO;如果速度依然没有提升,说明瓶颈主要是磁盘IO。
如果是单机普通硬盘的话,这速度真的挺快了,要是要提速,弄成分布式数据库集群,换成SSD,java方面的话估计没什么提升的,纯jdbc了