程序优化得问题--请高手帮忙

cmy3918 2004-09-15 08:37:06
ResultSet rs1=stmt.executeQuery("select jh,cmd,ny,lcy,ym,zhhs,gt from yuebk where yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny+"' and yuebk.zhhs>90 and trim(yuebk.gt) in ('11','31','41')");
while(rs1.next()){
String qq=rs1.getString("jh").trim();
float cmd=rs1.getFloat("cmd");
ResultSet rsbq1=stmt1.executeQuery("select jh,cmd,ny,lcy,ym,zhhs,gt from yuebk where yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny1+"' and trim(jh)='"+qq+"' and trim(yuebk.gt) in ('11','31','41')");
if(rsbq1.next()){
float cmd1=rsbq1.getFloat("cmd");
ResultSet rsb1=stmt1.executeQuery("select jh from csk where trim(csk.jh)='"+qq+"'");
if (rsb1.next()){
is1=is1+1;
iss1=is1;
i1=i1+cmd;
i2=i2+cmd1;
}else{
ibs1=ibs1+1;
ibss1=ibs1;
ib1=ib1+cmd;
ib2=ib2+cmd1;
}
}
}
if(is1==0){
is1=1;
}
if(ibs1==0){
ibs1=1;
}
这段程序执行起来要半小时得时间,人家客户不愿意了。
你说我怎么办。呵呵。
各位哥哥给个意见啊。
帮帮小弟啊 。
在这谢了先!!!
...全文
166 点赞 收藏 34
写回复
34 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
alaal 2004-09-18
如果时间再长一些,MS-SQL这样的数据库还会因为超时而中断处理,ORACLE就不存在这个问题(典型的JAVA风格^_^我喜欢)
回复
alaal 2004-09-18
呵呵,今天结帖我才看到,笔误,应该是"存储过程"(不过尽量不要用,维护起来十分不便)~~~谢谢两位大侠指点,误导了楼主,实在过意不去啊~~^_^.另外ORACLE在处理海量数据的时候的确比(MS-SQL,MYSQL)强很多,sybase也可以
回复
xch28 2004-09-15
的确和连接池及数据库类型没关系。
建议将功能细化,看有没有其他的方式解决,不要搞3次循环查询。
你的程序看了第一句俺就晕了。^_^
回复
happyct 2004-09-15
To z_jordon(mike jordon) :

Mysql小数据量查询比较快。海量数据不要拿去和Oracle/Sqlserver比,特别是Oracle。

如果他的数据量比较大的话,假设都为100000条(其实不算大)。循环两次试试??

我建议他用Oracle等代替是“万一找不到其它更好的方法。可以利用Oracle的存储过程等手段解决”
回复
happyct 2004-09-15
和连接池没关系,你们这些人不要在这里误导,不懂装懂!!

主要问题就在你的3次循环查询。这是很耗时间的,想办法把查询优化。一般来说,数据库的查询是不能超过2个循环的。
回复
eddygtimegod 2004-09-15
可以直接把第一次查到结果存成表再查符合trim(jh)='"+qq+"'的结果,或者第二次直接用trim(jh)='"+qq+"'去查,因为其结果集已经符合第一个条件。不过,第一个方法比第二个快。如果我有理解错误,请指正。
回复
eddygtimegod 2004-09-15
我建议你拆表,把表的逻辑重组,你的jh字段是·第一与第二次查询的区别,可以考虑拆开,当然,我不了解你具体字段的逻辑,所以,你可以在维持逻辑一致性的情况下,拆成2-3张。
还有我有一个狠奇怪的想法不知道对不对,大家指正一下。
既然
ResultSet rs1=stmt.executeQuery("select jh,cmd,ny,lcy,ym,zhhs,gt from yuebk where yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny+"' and yuebk.zhhs>90 and trim(yuebk.gt) in ('11','31','41')");
的rsl肯定满足:yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny+"' and yuebk.zhhs>90 and trim(yuebk.gt) in ('11','31','41')");
那第二个查询:
stmt1.executeQuery("select jh,cmd,ny,lcy,ym,zhhs,gt from yuebk where yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny1+"' and trim(jh)='"+qq+"' and trim(yuebk.gt) in ('11','31','41')");
主要的区别就是and trim(jh)='"+qq+"'这句,逻辑就是你先找它符补符合第一个查询的条件然后再在符合的结果集中再查既符合条件1也符合条件二的结果集!
问题是,你这句and trim(jh)='"+qq+"'是在符合的结果集中获得,所以,第二句查询是做了匹配第一个条件的无用工,可以利用第一个一符合条件一的结果集(也是理论最小的),做第二个条件的查询,这就可以大大降低查询复杂度,大家觉得我说得对不对?请指正。
回复
z_jordon 2004-09-15
楼主你的意思是不是要有两条记录,他们的jh值相同ny的值分别为ny和ny1
然后ny='"ny''的记录中jh,cmd的值和ny='"ny1"'的记录中cmd的值在第三个查询中有用到?
如果是的话,程序还是可以改善的,但是第二次在for循环中的查询还是得用到。
回复
z_jordon 2004-09-15
靠,连接池跟查询速度有什么关系,奇怪,一些人懂都不懂就在这边乱讲。
用MYSQL又怎么啦,MYSQL的查询速度甚至比ORACLE还快,动不动就叫人换数据庫,大哥你好牛逼啊。
回复
cmy3918 2004-09-15
先谢谢各位兄弟了。
我下去再试试。
回复
alaal 2004-09-15
这种情况难以避免,但也不用半个小时吧......

你把这个拿到循环外面去,在外面声明:
ResultSet rsbq1 = null;

rsbq1=stmt1.executeQuery("select jh,cmd,ny,lcy,ym,zhhs,gt from yuebk where yuebk.lcy>=0 and yuebk.ym>=0 and trim(yuebk.km)='"+yk+"' and trim(yuebk.ny)='"+ny1+"' and trim(jh)='"+qq+"' and trim(yuebk.gt) in ('11','31','41')");

即使这样情况也不会有很大的改观,看来只能用连接池来解决了
回复
yjsmask 2004-09-15
楼主真的要从数据库下手了哦
你的语句写得太。。。整理下吧
回复
cmy3918 2004-09-15
这只是一部分要改连接池太麻烦了。
我们这个程序光是连接就有十多个啊。
有好多得数据要从不同得用户得表中调。
回复
cmy3918 2004-09-15
如果我把三个查询合成一个得话
子查询得准确型如何,还有速度能否快些呢。
回复
pifulu 2004-09-15
循环里还有查询阿,当然很慢拉;
1.用存储过程应该能解决一部分的问题
2.如果是循环的话,这种问题是不是能用PrepareStatement解决一些呢
3.用连接池试试看
回复
kingmaxno1 2004-09-15
好一个晕字了得,楼主,最好整理一下程序,把传的语句先单独写出来,在运行,
还有,你肯定要从数据库下功夫了,如果你的数据库不能改,就只好在SQL语句上下功夫了
回复
happyct 2004-09-15
和Trim()没多大关系,主要问题是你的三重循环。

假设平均一次查询0.5秒,你算算你光是查询得花多少时间??数据每个数据集多100条。你就得多花100*100*100*0.5秒的时间。。。(当然,具体时间不是这么算的,但原理就是这样)
回复
cmy3918 2004-09-15
因为客户还有一个总得数据库。
又一部分数据要从他以前得库中调。
那他以前得库中有些字段用得是
char类型得。
所以必须要用trim啊。
回复
happyct 2004-09-15
不知道你想干什么?但你这个程序,说句实在话,不知你是怎么设计的!

第一次见过,在查询表时居然有3重循环,半个小时算优惠你了,在多个10000条记录的话,恐怕要1个小时了。。

程序没问题。你多在数据库上下功夫吧。

你用的什么数据库?但愿不是Mysql。否则,建议你改成Oracle或SqlServer等大型数据库。把前面2次的查询想法合成一个(注意效率)

在相关字段上建索引(如果改字段用到了like、in等查询关键字,就不要索引,建了也没用)
回复
haroyy 2004-09-15
为什么不用存储过程?
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-09-15 08:37
社区公告
暂无公告