我这里有段代码原来是用prepareStatement的批处理来处理一批sql语句: 
select p.datatype, p.userfieldid, u.datetimevalue, u.intvalue, u.stringvalue, u.decimalvalue, u.notes from tr_userfield p, tr_requestvalue u where p.userfieldid = u.userfieldid and u.userfieldid in (6580,6561,6562) and u.requestid = ? 
在执行的时候循环赋值,我想提高下查询的效率,所以用IN来替换: 
select u.requestid,p.datatype, p.userfieldid, u.datetimevalue, u.intvalue, u.stringvalue, u.decimalvalue, u.notes from tr_userfield p, tr_requestvalue u where p.userfieldid = u.userfieldid and u.userfieldid in (6580,6561,6562) and u.requestid in(2540,2541,2560,2406,2408,2411,2412,2414,2416,2417,2420,2424,2423,2428,2435,2429,2430,2431,2433,2434,2436,2399,2437,2444,2438,2440,2441,2660,2661,2700,2449,2450,2454,2641,2402,2600,2419,2458,2680,2620,2461,2463,2464,2465,2640,2720,2580,2468,2469,2470,2418,2473,2474,2446,2451,2453,2456,2581)order by u.requestid 
但是执行之后发现时间并没有减少,是不是prepareStatement的批处理效率已经很高了不能再优化了?用 
IN的SQL用了order by, 是不是这个原因呢? 

解决方案 »

  1.   

    将in里的数据,放在临时表中,然后将sql修改为两表关联的方式去查询会快很多。
      

  2.   

    然后我看是乱说了:
    LZ给的例子好像是有规律的,都比较接近,24## / 25##
    可以找出最大最小值用一个between .. and ..把该取的数据一次取出来再处理一下呢?
      

  3.   

    如果经常这样查询,为什么不在数据库端进行优化设计呢?
    用JDBC优化效果不大
      

  4.   

    按道理LZ的第二条语句更加费时,如果大量数据用索引,过程是必须的索引使用原则如下:
    1>.在条件表达式中经常用到的不同值较多的列上建立索引2>.在不同值少的列上不要创建索引
             比如:在员工表的[性别]列上只有“男”或者“女”两个不同值,如果建立索引,不但不会提高查询效率,反而会降低更新速度3>.在经常进行连接,但是没有指定为外键的列上建立索引4>.在频繁进行排序或分组的列上建立索引5>.在连接查询中,对表的顺序存取可能对查询效率产生致命的影响。避免这种情况的主要方法就是对连接的列进行索引。
      

  5.   

    你把二个in的先后顺序换一下看看。这都主要是sql优化问题,不关JAVA的事.
    在一个跟采用何种DB有关的。
      

  6.   

    order by group by 都会.降低.效率
      

  7.   

    把 IN 换成 exists看看