+ -
当前位置:首页 → 问答吧 → 删除效率问题

删除效率问题

时间:2011-12-21

来源:互联网

方法一
DataTable dt = silkPlanDataset.MT_PL_ZS_TASK_DEL.GetChanges(DataRowState.Deleted);
  if (dt != null)
  {
  //dt.RejectChanges();
  DateTime dtime1 = DateTime.Now;
  DataColumn[] keys = new DataColumn[1];
  keys[0] = dt.Columns["ZS_TASK_DEL_ID"];
  dt.PrimaryKey = keys; //指定主键
  tran = conn.BeginTransaction();
  sql = "delete from MT_PL_ZS_TASK_DEL where ZS_TASK_DEL_ID =:ZS_TASK_DEL_ID";
  command = db.GetSqlStringCommand(sql);
  db.AddInParameter(command, "ZS_TASK_DEL_ID", DbType.String, "ZS_TASK_DEL_ID", DataRowVersion.Current);
  DataSet ds = new DataSet();
  ds.Tables.Add(dt);
  db.UpdateDataSet(ds, "MT_PL_ZS_TASK_DEL", null, null, command, tran);
  tran.Commit();
  DateTime dtime2 = DateTime.Now;
  TimeSpan tp = dtime2 - dtime1;
}
方法二
DataTable dt = silkPlanDataset.MT_PL_ZS_TASK_DEL.GetChanges(DataRowState.Deleted);
  if (dt != null)
  {
  //dt.RejectChanges();
  DateTime dtime1 = DateTime.Now;
  DataColumn[] keys = new DataColumn[1];
  keys[0] = dt.Columns["ZS_TASK_DEL_ID"];
  dt.PrimaryKey = keys; //指定主键
  tran = conn.BeginTransaction();
  sql = "delete from MT_PL_ZS_TASK_DEL where rowid =(select rowid from MT_PL_ZS_TASK_DEL where ZS_TASK_DEL_ID = :ZS_TASK_DEL_ID)";
  command = db.GetSqlStringCommand(sql);
  db.AddInParameter(command, "ZS_TASK_DEL_ID", DbType.String, "ZS_TASK_DEL_ID", DataRowVersion.Current);
  DataSet ds = new DataSet();
  ds.Tables.Add(dt);
  db.UpdateDataSet(ds, "MT_PL_ZS_TASK_DEL", null, null, command, tran);
  tran.Commit();
  DateTime dtime2 = DateTime.Now;
  TimeSpan tp = dtime2 - dtime1;
}

采用企业库删除的时候,一次删除200条记录,方法二效率更高,为什么?
方法二是先查找了rowid 然后再删除.

作者: sk9979   发布时间: 2011-12-21

原因很简单,
第1种做法因为WHERE子句中存储参数:ZS_TASK_DEL_ID,对于表的每条记录进行判断时都要进行一次参数绑定。
而第2种做法确只需要绑定一次。

作者: LuiseRADL   发布时间: 2011-12-21

觉得应该是MT_PL_ZS_TASK_DEL 有索引的原因。

作者: yangqm22   发布时间: 2011-12-21

方法2还可以优化...in 改为 exist

作者: zujinsheng   发布时间: 2011-12-21

是根据主关键字删除的,所以直接用= 没有用in 或者exist

2楼的回答没看明白,两个sql 都带了参数,不是都要判断吗

作者: sk9979   发布时间: 2011-12-21