sql执行万条update语句优化

几个月没有更新笔记了,最近遇到一个坑爹的问题,顺道记录一下。。数据库

需求是这样的:一次性修改上万条数据库。c#

项目是用MVC+linq的。优化

原本想着用 直接where()this

1
var latentCustomerList = this .FindAll().Where(m => arrId.Contains(m.CustomerID.ToString())).ToList();

这样子执行,意料之中的就是出错了,出啥错,本身试了就知道了。哈哈spa

 

想来就只有直接操做数据库了。第一次的想法,直接就是for拼接语句,拼是拼了。3d

1
2
3
4
5
6
for ( int i = 0; i < obaList.Count; i++)
                {
                    arrId[i] = obaList[i].CustomerID.ToString();
                    sbUpdateSqlStr.AppendFormat( "update dbo.Customer set IsValid=1 where CustomerID='{0}' ;  " , arrId[i]);
                    
                }

但是执行起来总共花费了7秒。第二次花费4.5秒,第三次5秒。调试

数据库都是争分夺毫秒。这样拼了一万多条的语句还真不是办法。调试进去也许你也会崩溃。。。就想着能不能快,再快。就想到了INcode

因而就改为了下面的方法。orm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for ( int i = 0 ; i < obaList.Count; i++)
                 {
                     arrId[i] = obaList[i].CustomerID.ToString();
                     if (i != 0 && i % 50 == 0 )
                     {
                         ids = ids.Remove(ids.Length - 1 );
                         sbUpdateSqlStr.AppendFormat( "update dbo.Customer set IsValid=1 where CustomerID in({0}) ;  " , ids);
                         ids = "'" + arrId[i] + "'," ;
                     }
                     else
                     {
                         ids += "'" + arrId[i] + "'," ;
                     }
                     
                 }

 

看看总共的执行时间吧。。blog

也只能是这样的速度了...

 

说说最后的思想吧,其实就是减小执行语句数量的问题,把本来须要执行12223条的语句,减小了50倍,也就是245条。效率不言而喻了。(实际使用须要结合数据库索引以及in的问题。)

作到这,想到Excel导入数据库的时候是否是也会有另一种优化方法。。。

菜鸟求教,请勘误。

本文从百度空间搬家到博客园。。