create table AC_Article_KeyWords_Relation
(
  KeyWords varchar(100),
  ArticleId int
)
ArrayList arrOld=new ArrayList();
for(int i=0;i<100000;i++)
{
   arrOld.Add("test|"+i);
}
for (int i = 0; i < arrOld.Count; i++)
{
     string data = arrOld[i].ToString();
     string KeyWords = data.Substring(0, data.IndexOf("|"));
     int ArticleId = Convert.ToInt32(data.Substring(data.IndexOf("|") + 1));
     deleteAakrResult += ArticleKeyWordsRules.deleteOneDataAC_Article_KeyWords_Relation(KeyWords, ArticleId);
} public static int  deleteOneDataAC_Article_KeyWords_Relation(string KeyWords, int ArticleId)
{
      UpdateTableData query = new UpdateTableData();
      return query.DeleteOneDataAC_Article_KeyWords_RelationQuery(KeyWords, ArticleId);
}数据集文件(Query)
delete from AC_Article_KeyWords_Relation where KeyWords=@KeyWords and ArticleId=@ArticleId我的这个删除速度很慢,大约20条/秒谁能告诉我应该怎么改啊?

解决方案 »

  1.   

    还有100000这为什么写死了?直接循环ArrayList的行也比这好撒。
      

  2.   

    这个是往里面添加的测试数据
    实际中的数据时根据两个ArrayList比较得出的,数据会比这还多
      

  3.   

    拼接一下吧,免复麻烦,把要删除的数据一次性传过来List<string> sqlWheres=new List<string>();
    for (int i = 0; i < arrOld.Count; i++)
    {
         string data = arrOld[i].ToString();
         string[] strArray=data.split('|');
         if(2==strArray.Length)
         {
           sqlWheres.Add("KeyWords='"+data[0]+"' and ArticleId="+data[1]);
         }
    }
    //生成删除语句
    if(sqlWheres.Count>0){
      string sqlDelStr="delete from AC_Article_KeyWords_Relation where"+string.Join(" or ",sqlWheres.ToArray())
    }
      

  4.   


    1 为 KeyWords 和 ArticleId 加上索引
    2 将所有的删除操作封装在一个事务
      

  5.   

    不能删表,.xsd 文件不支持
      

  6.   

    不考虑检索速度的话,把主键ID设成索引字段就可以了.不过你的代码这样写也影响了速度,在循环体内调用到的deleteOneDataAC_Article_KeyWords_Relation方法返回的int值如果能在事件循环前处理,到循环体内在就可以免去每次循环时还要去执行它,这样速度一定快不少
      

  7.   

    我这个表里没有主键Id,表中的那个id是从别的表里读取出来的,它也是可以重复的
      

  8.   

    在SQL SERVER中通过临时表,批处理删除
    建立索引,分布
    重写逻辑