晕,是不是一定要查三次啊,慢是当然了,看看能不能从select上解决

解决方案 »

  1.   

    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;
    }
      

  2.   

    我也是个新手,意见仅供参考:
    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')");
    String qq; //
    float cmd;//
    ResultSet rsbq1;//
    float cmd1;//
    ResultSet rsb1;//
    while(rs1.next()){
     qq=rs1.getString("jh").trim();
     cmd=rs1.getFloat("cmd");
     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()){
     cmd1=rsbq1.getFloat("cmd");
     rsb1=stmt1.executeQuery("select jh from csk where trim(csk.jh)='"+qq+"'");if (rsb1.next()){ //
    iss1=++is1;
    i1+=cmd;
    i2+=cmd1;
    }else{
    ibss1=++ibs1;
    ib1+=cmd;
    ib2+=cmd1;
    }
    }
    }
    is1=is1==0?1:is1;//
    ibs1=ibs1==0?1:ibs1;还有就是从数据库入手,把相应的表或者数据行加约束之类的东西,使数据载保存到数据库中时,已经是消除空格的。这样,你就可以不必调用trim()。
      

  3.   

    时间都耗费到执行sql语句上了,写程序时最好不要在循环中执行sql语句,尝试其他办法去解决他。
      

  4.   

    不知道你想干什么?但你这个程序,说句实在话,不知你是怎么设计的!第一次见过,在查询表时居然有3重循环,半个小时算优惠你了,在多个10000条记录的话,恐怕要1个小时了。。程序没问题。你多在数据库上下功夫吧。你用的什么数据库?但愿不是Mysql。否则,建议你改成Oracle或SqlServer等大型数据库。把前面2次的查询想法合成一个(注意效率)在相关字段上建索引(如果改字段用到了like、in等查询关键字,就不要索引,建了也没用)
      

  5.   

    因为客户还有一个总得数据库。
    又一部分数据要从他以前得库中调。
    那他以前得库中有些字段用得是
    char类型得。
    所以必须要用trim啊。
      

  6.   

    和Trim()没多大关系,主要问题是你的三重循环。假设平均一次查询0.5秒,你算算你光是查询得花多少时间??数据每个数据集多100条。你就得多花100*100*100*0.5秒的时间(当然,具体时间不是这么算的,但原理就是这样)
      

  7.   

    好一个晕字了得,楼主,最好整理一下程序,把传的语句先单独写出来,在运行,
    还有,你肯定要从数据库下功夫了,如果你的数据库不能改,就只好在SQL语句上下功夫了
      

  8.   

    循环里还有查询阿,当然很慢拉;
    1.用存储过程应该能解决一部分的问题
    2.如果是循环的话,这种问题是不是能用PrepareStatement解决一些呢
    3.用连接池试试看
      

  9.   

    这种情况难以避免,但也不用半个小时吧......你把这个拿到循环外面去,在外面声明:
    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')");即使这样情况也不会有很大的改观,看来只能用连接池来解决了
      

  10.   

    靠,连接池跟查询速度有什么关系,奇怪,一些人懂都不懂就在这边乱讲。
    用MYSQL又怎么啦,MYSQL的查询速度甚至比ORACLE还快,动不动就叫人换数据庫,大哥你好牛逼啊。
      

  11.   

    楼主你的意思是不是要有两条记录,他们的jh值相同ny的值分别为ny和ny1
    然后ny='"ny''的记录中jh,cmd的值和ny='"ny1"'的记录中cmd的值在第三个查询中有用到?
    如果是的话,程序还是可以改善的,但是第二次在for循环中的查询还是得用到。
      

  12.   

    我建议你拆表,把表的逻辑重组,你的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+"'是在符合的结果集中获得,所以,第二句查询是做了匹配第一个条件的无用工,可以利用第一个一符合条件一的结果集(也是理论最小的),做第二个条件的查询,这就可以大大降低查询复杂度,大家觉得我说得对不对?请指正。
      

  13.   

    可以直接把第一次查到结果存成表再查符合trim(jh)='"+qq+"'的结果,或者第二次直接用trim(jh)='"+qq+"'去查,因为其结果集已经符合第一个条件。不过,第一个方法比第二个快。如果我有理解错误,请指正。
      

  14.   

    To z_jordon(mike jordon) :Mysql小数据量查询比较快。海量数据不要拿去和Oracle/Sqlserver比,特别是Oracle。如果他的数据量比较大的话,假设都为100000条(其实不算大)。循环两次试试??我建议他用Oracle等代替是“万一找不到其它更好的方法。可以利用Oracle的存储过程等手段解决”
      

  15.   

    晕了如果循环中需要执行sql查某一条记录,尽量用PreparedStatement
      

  16.   

    问题应该是出在你的那个while循环上,如果rs1有100条数据,那么这个while里面的查询就得重复执行100*2次(你的while循环里面有两个查询)这样子不慢才怪呢?如果是1000条呢??呵呵,什么数据库也受不了!
      

  17.   

    呵呵,今天结帖我才看到,笔误,应该是"存储过程"(不过尽量不要用,维护起来十分不便)~~~谢谢两位大侠指点,误导了楼主,实在过意不去啊~~^_^.另外ORACLE在处理海量数据的时候的确比(MS-SQL,MYSQL)强很多,sybase也可以
      

  18.   

    如果时间再长一些,MS-SQL这样的数据库还会因为超时而中断处理,ORACLE就不存在这个问题(典型的JAVA风格^_^我喜欢)