ResultSet.next() 速度慢 怎么办

       如果 java中执行ResultSet.next() 非常慢。

       首先可以肯定的是ResultSet.next() 效率低下是错觉真正效率低下的是写出SQL的执行速度,同样ResultSet只是代表着结果集,而不表示它就是整个结果集的数据

       当出现奇怪的问题的时候,不要这么做

  1. 大量重复测试
  2. 怀疑框架,怀疑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了

 

你可能感兴趣的:(数据库)