关于大数据批量更新的看法

需求:更新一表某字段,数据量4W。

一开始为了不反复访问数据库就把4W条sql语句拼接到了一起

结果发现在本地运行要8分钟,在服务器运行直接系统内存不足,因为服务器还运行了其他程序

详情见http://bbs.csdn.net/topics/390388642

最后改成了存储过程,因为存储过程有如下特点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
 
服务器执行更新程序的时候,突然公司跳闸了,没看到服务器具体的执行时间,回来已经更新完成。本地测试了下10秒内就完成了4W数据量的更新。
另外做批量可以用到事务+多线程。
附上代码
View Code
 string first = null;
        string second = null;
        protected void Page_Load(object sender, EventArgs e)
        {

        }
       
        public void DB()
        {       
            string sql=null;
            DataTable dt = new DataTable();
            dt = Manage.GetAllNop_ProductVariant();
            IList<Nop_Category> list = new List<Nop_Category>();
            list = Manage.GetAllNop_Category();
            for (int i = 0; i < dt.Rows.Count; i++)//这里是4级分类的判断
            {
               int categoryID=Convert.ToInt32(dt.Rows[i]["categoryID"]);
               int parentCategoryID = Convert.ToInt32(dt.Rows[i]["parentCategoryID"]);
               int productVariantId = Convert.ToInt32(dt.Rows[i]["productVariantId"]);
               int pcid=Manage.GetParentCategoryIDByCategoryID(parentCategoryID);
               if (pcid != 0)
               {
                   int childId = Manage.GetParentCategoryIDByCategoryID(pcid);
                   if (childId != 0)
                   {
                       string yi = Manage.GetNameByCategoryID(childId);
                       string er = Manage.GetNameByCategoryID(pcid);
                       QuanJu(yi, er);
                      // sql += "update [Nop_ProductVariant] set SKU='c'+'" + first + "'+'" + second + "'+RIGHT('00000'+CAST(ProductID AS VARCHAR),6) "
                      //+ "where [ProductVariantId]=" + productVariantId + ";";
                       Manage.UpdateSKU(first,second,productVariantId);
                   }
                   else
                   {
                       string yi = Manage.GetNameByCategoryID(pcid);
                       string er = Manage.GetNameByCategoryID(parentCategoryID);
                       QuanJu(yi, er);
                      // sql += "update [Nop_ProductVariant] set SKU='c'+'" + first + "'+'" + second + "'+RIGHT('00000'+CAST(ProductID AS VARCHAR),6) "
                      //+ "where [ProductVariantId]=" + productVariantId + ";";
                       Manage.UpdateSKU(first, second, productVariantId);
                   }
                  
               }
               else
               {
                   string yi = Manage.GetNameByCategoryID(parentCategoryID);
                   string er = Manage.GetNameByCategoryID(categoryID);
                   QuanJu(yi, er);
                  // sql += "update [Nop_ProductVariant] set SKU='c'+'" + first + "'+'" + second + "'+RIGHT('00000'+CAST(ProductID AS VARCHAR),6)"
                  //+ " where [ProductVariantId]=" + productVariantId + ";";
                   Manage.UpdateSKU(first, second, productVariantId);
               }
            


            }
            
           // Manage.update(sql);
           
        }
原文地址:https://www.cnblogs.com/chai1338/p/2954416.html