【发布时间】:2013-07-09 12:49:46
【问题描述】:
我必须更新一个包含数百万条记录的表。现在我将要更新的所有记录的 id 存储在列表中。查询的实际生成如下:
string queryPart="";
foreach (int id in transactionsToUpdate.ToList())
{
queryPart+="TransactionID="+id;
queryPart+=" OR ";
}
queryPart += "1=0";
string query = @"UPDATE dbo.OutgoingQueue SET Status='C' WHERE "+queryPart;
目前即使列表中有 100,000 个值,也会出现两个问题。首先,上面的代码需要很长时间才能执行(查询形成部分)。其次,当我在 DB 上执行查询时,它会给出 Timeout Expired 异常。有没有更好的方法来实现我想要的?
更新: 使用 stringbuilder 解决了第一个查询需要很长时间形成的问题。但第二个问题仍然存在。如果我增加超时,那么我会得到 sql 的资源异常。
【问题讨论】:
-
在我的项目中没有使用 EF。
-
创建一个接受逗号分隔的 id 列表的存储过程。然后在存储过程中使用带有“IN”子句而不是“OR”的 id 的更新语句。从 .Net 将逗号分隔的列表传递给存储的过程。
-
ID 是连续的吗?您能否对它们进行排序并使用 `where TransactionID > x AND TransactionID
-
将 ID 转储到临时表中,然后根据连接或 IN(x) 查询进行更新。它会更快。
-
@KamranShahid :是的,这就是我最终所做的。