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了

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值