幾個月沒有更新筆記了,最近遇到一個坑爹的問題,順道記錄一下。。數據庫
需求是這樣的:一次性修改上萬條數據庫。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導入數據庫的時候是否是也會有另一種優化方法。。。
菜鳥求教,請勘誤。
本文從百度空間搬家到博客園。。