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

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;
}
这段程序执行起来要半小时得时间,人家客户不愿意了。
你说我怎么办。呵呵。
各位哥哥给个意见啊。
帮帮小弟啊 。
在这谢了先!!!
...全文
191 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
为什么不用存储过程?
加载更多回复(14)
本说明分两部分 补充: 我们的论坛地址: http://bbs.eshanfeng.com 2009/07/22 1. Aws ====================================================================================================== Ajiu AspWebServer V2.0 服务器 (版本号2.0.2.4) 最后更新: 2009-04-13 顾名思义,本软件是一款小巧轻盈的Asp Web服务器,她,能几近完美的支持ASP~~ 如果您厌倦了IIS的庸肿,如果您不愿意第N次重装IIS,如果您对替代品这个词很感兴趣,您尝试一下Ajiu AspWebServer吧... 使用说明: 『1』将您的网页置与本软件同一目录下,双击运行! 『2』双击右下角任务栏图标即可为您开启您的网站! 『3』默认主页:default.asp;default.html;index.asp等等; 更新: 2007-1-1 Aws v1.0发布于CnBeta.com 2007-1-7 增加服务器监测功能 2007-1-12 增加快捷键 2007-1-20 增加 v1.1 aws 随机端口版 2007-2-3 增加 目录浏览 2007-3-31 大动手术,更换图标,增强界面 。。。 2007-4-29 默认端口有两个,当你启用了IIS的时候,它会自动调用8081端口,聪明了一点...(已上传) 2007-5-25 新增自定义目录浏览,新增ftp服务器 2007-6-1 完善Ftp服务器功能 2007-6-15 新增完全自定义默认主页,完全自定义默认端口号 2007-6-19 新增自定义网页顶部内容功能,支持Html语法(仅在启用目录浏览的时候才生效),改善了选项界面 2007-6-22 实现虚拟目录功能,可以自行设置其是否支持目录浏览,是否支持asp,设置默认主页等... 2007-6-27 双击打开的不一定是127.0.0.1了,如果你有一个192.168.1.3那么她将打开这个,方便在局域网里工作!对选项稍有点改观... 2007-6-29 双击在默认的浏览器中打开,而不一定是internet explorer!(windows xp sp2,默认The World浏览器中测试通过,其它系统其它默认浏览器帮忙测试一下 2007-7-2 小失误更新 2007-7-10 新增定时关机和定时重启功能,唉,累啊 2007-7-11 修正了好几个让我郁闷的错误,还有两个在解决中... 2007-7-13 真正实现如果你的默认浏览器是TheWorld,Maxthon,Opera那么双击图标她将相对应的浏览器中打开主页,从菜单中则是在IE中打开,堪称完美版了~~! 2007-7-18 新增可以开启就隐藏任务栏图标! 2007-8-30 修复了菜单切换目录浏览的小失误,现在可以正常使用了 修复了选项里定时关机无效的小误,现在可以放心交给aws来定时关机重启了(昨天晚上用它定了一个小时后关机,结果今天早上起来的时候发现机子还开着,仔细检查,原来关机执行的是重启操作,郁闷了下,所以今天就把这个bug fix掉),但要记得设置了定时关机重启的时候不要把Aws的选项界面关掉,否则定时会不起作用 去掉了Ftp服务器自带的配置程序,只保留了一个Ftp服务器和ini文件,有需要完整图形界面配置程序和注册机的朋友到我的网站上去下载,高手自己改配置文件就可以的哈.体积减少了好多... 2007-10-23 修复了"严重错误,不要改名字..."的错误 你会惊奇的发现现在只有627K了,功能不减(下个版本着重改善UI,如果时间允许的话 ) 2008-03-13 增加了两个功能:自定义出错信息和连接限制,界面全新改版,优化配置方式 2008-04-13 增加服务记录启动时间功能,小时钟,在线读取使用手册功能 2008-06-03 增加了是否独占运行功能,如果禁用独占方式,则Aws将被允许同时运行多个http服务,这样的话你就可以给每个Aws进程指定一个不同的端口,感觉不错吧,good luck~ 2008-07-01 Aws V2.0正式版发布 2008-12-22 默认可以同时运行多个Aws进程,增加用户统计 2008-03-03 取消Ftp服务器功能,防某些杀毒软件报毒, 下一版本拟加入多网站支持,比如www.A.com指向根目录下的A文件夹, www.B.com 指向根目录下的B文件夹,共用80端口. 2008-03-30 专为www.hicoder.com定制的一个版本:延长时间限制,启动时自动打开本地网站 2008-04-13 正式加入多网站支持功能,比如www.A.com指向根目录下的A文件夹, www.B.com 指向根目录下的B文件夹,共用80端口. 另外修正了虚拟目录设置的Bug和打开选项无法显示的Bug Aws使用小技巧小结: 1.双击在默认浏览器中打开,而选择菜单里的Http://127.0.0.1 (或你的http://192.168.1.4 )则会在Ie里面打开 2.在命令行里输入 Aws.exe -install 就可以将Aws安装为系统服务,并开机运行,这样即使不登录系统它也可以运行,要解除输入 Aws.exe -remove 3.待续 如果你有什么问题反馈给我--blog.eshanfeng.com

81,117

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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