关于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语句