当前位置: 代码迷 >> Oracle认证考试 >> 关于在for循环中执行sql语句效率的有关问题
  详细解决方案

关于在for循环中执行sql语句效率的有关问题

热度:8190   发布时间:2013-02-26 00:00:00.0
关于在for循环中执行sql语句效率的问题。
我们在项目中要用到批量删除的功能 ,我在项目中是这样写的:

String[] strArrayCheckIds = request.getParameterValues("checkid");

int iLength=strArrayCheckIds.length;

for(int i=0;i<iLength;i++){

  //在这里我用执行了sql语句:delete from tablename where in=...的删除操作。

  carService.delete(strArrayCheckIds[i]);  
}

从以上可以看出,我的sql操作上放到for循环中的,也就是说如果我删除5条数据,那么,会连续执行5条sql的删除操作。


但是项目经理不让我那样写,说会影响效率,他让我用delete from tablename in(...)的方式来做。
以下是代码:

String petroId="0";
String[] strArrayCheckIds = request.getParameterValues("checkid");

int iLength=strArrayCheckIds.length;

for (int i = 0; i < iLength; i++){
  petroId=petroId+","+strArrayCheckIds[i];
}
carPetroService.deleteByIds(petroId); //这里用delete from tablename where id in (....)的语法
return doList();

但是这种方法循环处理字符串,而用dele from tablname where id in(...)的语法来做的。但是这种sql的效率低啊。

哪种方法更好呢。效率上能差多少呢?
请高手指教!









------解决方案--------------------------------------------------------
引用楼主 xieyunchao 的帖子:
我们在项目中要用到批量删除的功能 ,我在项目中是这样写的: 

String[] strArrayCheckIds = request.getParameterValues("checkid"); 

int iLength=strArrayCheckIds.length; 

for(int i=0;i <iLength;i++){ 

//在这里我用执行了sql语句:delete from tablename where in=...的删除操作。 

carService.delete(strArrayCheckIds[i]);


从以上可以看出,我的sql操作上放到for循环中的,也就是说如果…

------解决方案--------------------------------------------------------
carPetroService.deleteByIds( )
这个方法怎样实现的,你没有说
如果用拼sql的方法构造列表,一次执行,效率要高点,但是可能会导致列表过长异常。这个处理了就没事

如果是一个个的调用
carService.delete( )
那就跟你的没区别了

可以建议的是,在ado.net中,可以用
DbDataAdapter.ExecuteBatch()
方法来批量执行sql

在java中,可以用
PreparedStatement.executeBatch();
  相关解决方案