日期:2014-05-17  浏览次数:21049 次

关于for循环中delete 和 拼接sql delete table in ()的效率比较??
现要根据id删除一批数据,


两种方法:
  1 就是 for(int i = 0; i < ids.size(); i ++){
   
  xxxService.deletById(ids.get(i));
  }

  2 拼接sql delete table id in (xxx,xxx,xxx,xxx)


如果这个数据有几百条甚至上千条,哪个效率更好点......



或有更好的方法....

------解决方案--------------------
这个我只知道in效率不高,一般都不提倡用in,但具体的与循环的效率这个我还真没研究过。等待楼下的解析!
------解决方案--------------------
不用 in 的路过~~ 没研究过循环和IN的效率问题 - -|||
------解决方案--------------------


第一种方法相当于你循环调用了service ,如果service上有注明事务、你相当于循环调用事务、
且没有声明事务,你也相当于循环操作了dao层、建议不要这样做、

第一种方法相当于 delete from table where id = 1;delete from table where id = 2;delete from table where id = 3;delete from table where id = 4;..... sql语句是很多的、相同的数据量相比之下肯定第二句比第一句快很多

第二种暂时也没有什么好的方式 建议批量处理的时候还是放弃框架的删除、使用原生sql、

如果是hibernate orm 框架 建议使用StatelessSession 无状态接口

http://blog.sina.com.cn/s/blog_57769b7b0100vgez.html

------解决方案--------------------
肯定是第二种快些,以为第一种循环开启事务 ,关闭事务,。。
------解决方案--------------------
我只能说你两种效率都不高。
1、效率慢在每次删除都进行一次数据库连接(网络连接是最耗时的)
2、in语句从设计之初就没把它当成高效来用
给你个第三种方案,效率会比这两个高很多,不是一个级别的。
3、用批处理。只连接一次数据库,同时又不用in
调整下你的方法
for(int i = 0; i < ids.size(); i ++){
xxxService.deletById(ids);
}
deletById方法里用batch操作删除语句
------解决方案--------------------
既然第二种用事务的时候,是将所有符合条件的删除放入同一个事务。第一种也应该将批量删除放入同一个事务,不然的话,需求不一样,也没什么好比较了。如果要求都放在同一个事务中,个人认为需要判断ids的中元素的多少,如果ids中很多,可以用第一种,可以用缓存进行分批删除。如果不多,用第二种比较方便,只需要写一个sql语句