谢谢大家的观点,对于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所带来的影响
第一种方案,执行一条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); 这里你就等同于执行一个查询举个例子:早晨挤公交的时候大家都挤着上车快。还是排好队上车快??
第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。
执行慢的原因,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语法很简单,关键是如何设计表并把握数据之间的关系
我的意思是:
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所带来的影响
第二种方案,执行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);
这里你就等同于执行一个查询举个例子:早晨挤公交的时候大家都挤着上车快。还是排好队上车快??
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。
第二种在内存中,结果集都具有一定得索引和优先算法了,肯定速度要快很多了
加入我要查询100000条记录中的中间的5条!~
用in的话就得全表扫描!~!所以会慢
应该说这2种方法的执行效率是差不多的,第一种方法之所以慢,我猜是HIBERNATE做了很多愚蠢的无用功。
你把HIBERNATE的SQL日志打开,就知道是怎么回事了。
数据库性能方面不强,学习下