同2楼 能不用in这类子查询就不要用
试试exist, 可能效果会比in好. 

解决方案 »

  1.   

    in 会造成全表扫表,性能当然差了许多in可以用join实现,你仔细考虑一下
      

  2.   

    谢谢大家的观点,对于in的使用会造成效率低,我也非常认同。但是我这里想说的不是in的问题。
    我的意思是:
    1.sql = select user from user …… where user.user_id in (select user.user_id from……)
      query = createSQLQuery(sql);
      List list = query.list();
    2.sqla = select user.user_id from……
      querya = createSQLQuery(sqla);
      List ls = querya.list();
      sqlb = select user from user …… where user.user_id in (ls);
      queryb = createSQLQuery(sqlb);
      List list = queryb.list();
    以上代码仅为了表达我所说的问题,
    第一种方案,执行一条sql语句,in后面接的是sql语句。
    第二种方案,执行2条sql语句,in后面接的是list。(先执行in后面的sql子句,再把返回的结果作为主sql的in后面的条件)
    2种方案返回的结果是一样的list,但是性能却差很远,见我测试的结果。这是为什么呢??因为2种方案都是用的in,所以这里不考虑使用in所带来的影响
      

  3.   

    第一种方案,执行一条sql语句,in后面接的是sql语句。 
    第二种方案,执行2条sql语句,in后面接的是list。(先执行in后面的sql子句,再把返回的结果作为主sql的in后面的条件) 
    2种方案返回的结果是一样的list,但是性能却差很远,见我测试的结果。这是为什么呢??因为2种方案都是用的in,所以这里不考虑使用in所带来的影响 你的第一个方案是把两个查询一块执行
    执行时会先执行in里面的查询。。然后在执行外面的select,等同于两个查询第二种方案是拆开处理:
    List ls = querya.list(); 
      sqlb = select user from user …… where user.user_id in (ls); 
    这里你就等同于执行一个查询举个例子:早晨挤公交的时候大家都挤着上车快。还是排好队上车快??
      

  4.   

    第2种方案也是执行2个查询,
    2.sqla = select user.user_id from…… 
      querya = createSQLQuery(sqla); 
      List ls = querya.list(); 
      sqlb = select user from user …… where user.user_id in (ls); 
      queryb = createSQLQuery(sqlb); 
      List list = queryb.list(); List ls = querya.list(); List list = queryb.list(); 这是2个查询,与第一个方案不同的是拆开执行了2次query。
      

  5.   

    1.应该是数据库内部查询,要在内存中建立一个临时表,这样非常浪费时间2.是hibernate的一个特性~hibernate将表全部加载到内存中了,你一个个查,也是去内存中找,而内存的效率不用我说吧
      

  6.   

    你的两个In 一个是在oracle数据库中进行,一个是在内存中进行第一种in造成的后果是要进行数据库的全表扫描,oracle的性能当然不行了
    第二种在内存中,结果集都具有一定得索引和优先算法了,肯定速度要快很多了
      

  7.   

    执行慢的原因,in里面的sql被重复执行,user总共有多少条记录就重复执行多少次,不慢才怪,下面是修改后的sql,如果表的索引做得好,执行效果与你第二种方案差不多,你去试一下select user from user,user_list_rec where user_list_rec.user_list_id=:listId and user_list_rec.user_id= user.user_id and user.delete_flg=0sql语法很简单,关键是如何设计表并把握数据之间的关系
      

  8.   

    不对吧,in里面的sql会重复执行??~~!!
      

  9.   

    没错!~!能不用in的地方就别用in!~!
    加入我要查询100000条记录中的中间的5条!~
    用in的话就得全表扫描!~!所以会慢
      

  10.   

    这和java的hibernate没关系,是sql优化方面的问题第一种in后面是一个子查询,当然慢,因为他要进行全表扫描第二种in后面是常量集合,速度当然快!
      

  11.   


    应该说这2种方法的执行效率是差不多的,第一种方法之所以慢,我猜是HIBERNATE做了很多愚蠢的无用功。
    你把HIBERNATE的SQL日志打开,就知道是怎么回事了。
      

  12.   

    我觉得设计好数据库的话,用hibernate会很简单的。
    数据库性能方面不强,学习下
      

  13.   

    效率是不一样的,与hibernate无关。第一种情况的sql直接在数据库中执行都是很慢的。