一次取出3万多条记录,这个时候使用rs.next()遍历,共耗时37秒,正常么?

caina3 2006-01-19 08:34:22
如题。
因为需要取出这3万多条记录然后进行统计分析,结果发现速度很慢,于是一步一步的测试时间消耗,结果发现居然是rs.next()耗时???
郁闷+疑问中......
...全文
843 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Larry1030 2006-01-20
  • 打赏
  • 举报
回复
gz
TinyJimmy 2006-01-20
  • 打赏
  • 举报
回复
一次取3万记录应该不会慢, 如果只是rs.next(), 我的时间大约 1.5秒, 如果将每个字段都 rs.getString()一次, 时间大约2.8秒 测试表38个字段, 内部有int, datetime, char, dec等不同类型的字段. 以前曾经做个一个不同数据库, 不同网络应用环境下的数据IO测试. 影响速度主要有:
1. 硬盘速度
很多时候一台机器又做数据库服务器, 又做应用服务器, 当看到硬盘灯常亮时, IO效率会显著下降
2. 网络
无论多好的网络, 只要通过网络就可能有开销, 网络主要开销在连接建立和并发通信碰撞上.如果通信使用大数据包一次传输, 要比多个数据包多次传输效率要高
3. CPU
如果运算CPU达到100%时, 并发计算效率显著下降
4. 数据库
数据库索引对设计数据存储最有效因素, 定期重新优化索引会提高整体计算效率. 索引建立要和计算方法相对应, 最大限度的发挥索引功效
SQLServer/Oracle/DB2使用运算速度差不多, 写入和读取相差不会超过5%
5. JDBC驱动
不同JDBC驱动, 对运算有一定影响. Oracle/DB2针对不同的应用环境, 都有本地和网络模式, 本地模式要比网络模式要快
6. 病毒软件
病毒软件对设计数据读写有相当大影响, 特别是涉及到文件读写的情况, 满负荷运行, 效率损失在10%~20%间

实践中, 运行最快的的情况是两机用直连线相连, 一台做数据存储, 一台做数据运算, 通信1000M, 得到的效果最好, 测试在不同的数据量, 测试曲线也是最稳定的
nick_622 2006-01-20
  • 打赏
  • 举报
回复
我也遇到和你一样的问题,你可以参考我的程序:
for(int i = 1;i <=154000; i+=1000){
String query = "SELECT html FROM dianping_page limit "+i+",100";

ResultSet rs = stmt.executeQuery(query);

//get count of table
//while has next 100 records
// get 100 record from db;
process(args, config, rs);
// count -100
// while end
}
hogn 2006-01-20
  • 打赏
  • 举报
回复
1、数据的计算,不要放到查询中。
2、查询显示太多的数据时,采用分页。
3、不要一次性把所有数据放到缓存里。
挑大梁 2006-01-20
  • 打赏
  • 举报
回复
结论就是没有问题了,一次取三万条
深蓝 2006-01-20
  • 打赏
  • 举报
回复
不呀!表达的很好啊,技术语言无须修饰.我理解你说的情况,并对你的做法表示支持!楼主是搞DM的吗?有机会交流一下
QQ: 59896103
MSN:hbsycw@hotmail.com
ChDw 2006-01-20
  • 打赏
  • 举报
回复
可以的话最好使用存储过程在数据库中计算完成,如果必须在Java中获取你可以试试设置一下
rs.setFetchSize(int rows);这样可能可以提高一点速度,

至于设置多大才能最好,就得多多测试了。这个和环境因素太大关系
caina3 2006-01-20
  • 打赏
  • 举报
回复
晕死,上面的话语句都有不通畅的地方,BS自己,口头表达能力越来越差了。
caina3 2006-01-20
  • 打赏
  • 举报
回复
charlie0895
对,你说的很对,这个思路本身就存在问题。不过当时的情况很急,当我获得需求的时候,经理告诉我,必须两天之内全部出来,否则这个客户我们基本就拿不到了。这里面需要获取几万条(当时并没有说是几万条,当时说的几万条的几十之一,打个比方就是当时说是要对一个学校的成绩进行统计,而后来却用于几十个学校的统计)记录的 中位数 标准差 偏度 峰值 均分差 标准误 鱼尾检验 等等。这些东西是我们平时不常用的,我必须立刻去查找资料然后解决(客户没有给我们资料,在市场中,常常很多的时候为了抢得一个市场,是需要我们在只有并不完善的需求的情况下出手的)。这个时候对我来说,分秒必争。于是我就只好按照最快的编码方式,而不是性能最优的方式。最后的结果是,我们是第一个出与他们的需求吻合度最高的DEMO(虽然是DEMO,但是却是从用户角度看,却是可以用他们的基础数据进行测试的一个小型演示系统),于是我们获得了单子。

而发现这个问题的时候,原先两天做的那个东西他们在继续“试用”,同时需求什么的在与他们联络从新获取。在这个阶段,发现原有的东西在某个页面速度很慢,最后调查出来发现是出现在那里。这时我对rs.next()的效率产生了疑问,我怀疑要么是rs.next()在记录较多的情况下耗时过长,要么是程序在其他地方还存在问题。于是我提出了我的问题。

//另:最后的结果是,其实也不是rs.next()的问题,凌晨6点的时候,修改了一些代码,现在在数据库没有索引的情况下,第一次访问页面时,5秒钟之内就可以出结果了.至于前面说用delphi测试ado花了9秒的事情,这个我不是很熟悉DELPHI,可能用法本身就是错的。不然我想它不应该这么慢的.
jspxnet 2006-01-20
  • 打赏
  • 举报
回复
一次去取这么多 思路就不对,有10万的时候,你不是要一下搞死机?
分时间段等方法,一次1000条左右的搞就行了.
Little_qd 2006-01-20
  • 打赏
  • 举报
回复
设计思路有些问题
尝试大部分的计算放到数据库进行
比如存储过程
kakashemen 2006-01-20
  • 打赏
  • 举报
回复
这个可以用算法来解决,不知道你为什么要一次取这么多,但是可以想象正常情况下不必要一次把所有都取出来了。
xiongbing528 2006-01-20
  • 打赏
  • 举报
回复
是啊。。必要的时候你可以考虑建立族或者是索引。从数据库端下手。。
ywz520 2006-01-20
  • 打赏
  • 举报
回复
很有经验,加分!
charlie0895 2006-01-20
  • 打赏
  • 举报
回复
一次去取这么多,这个思路本身就存在问题,问题不在于去提高取三万条数据的速度,而在于先减少一次取的数据量,思考什么样的逻辑是可行性良好的
doway 2006-01-19
  • 打赏
  • 举报
回复
rs.next() 只是移动一下指针,应该非常快。

结果集中行数很多时,不应该包括可变长度的列。
zdnetchina 2006-01-19
  • 打赏
  • 举报
回复
数据库用索引优化一下
zdnetchina 2006-01-19
  • 打赏
  • 举报
回复
一次取出来有意义吗?
caina3 2006-01-19
  • 打赏
  • 举报
回复
yaray(雅睿,生活在别处)
这么说来,就的确是rs.next()在记录较多的情况下耗时过长了?
我用delphi使用ado测过,相同情况下时间消耗只有4分之一。
caina3 2006-01-19
  • 打赏
  • 举报
回复
TO FaJa(FaJa):

数据统计
需要获取几万条记录的 中位数 标准差 偏度 峰值 均分差 标准误 鱼尾检验 等等
也许可以不一次取这么多条记录
不过那样的话中间的处理会比较烦比较容易出错
加载更多回复(2)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧