[英]How to make table updating more efficient in C#?
在下面的代码中,我试图通过客户 ID 列表来 go 并更新Confirmed字段以匹配给定记录中的 sysdate。 问题是,如果我分别为大约 40k 客户执行此操作,则需要 15-20 分钟才能运行,对于这样的操作来说有点太多了。 您能否就如何改进我的代码以更快地运行和/或减少数据库请求的数量给我一些建议?
foreach (int i in confirmCustomers)
{
queryString = @"
UPDATE TABLENAME
SET CONFIRMED = @datenow
WHERE ID = @id";
command = new SqlCommand(queryString, connection, transaction);
command.Parameters.AddWithValue("@id", i);
command.Parameters.AddWithValue("@datenow", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
command.ExecuteNonQuery();
}
对于 SQL Server 2016+,您可以 append JSON 数组中的所有 ID,例如
"[1,2,3,4,5,6,7,8,9]"
并将其作为字符串参数传递给命令,然后运行:
queryString = @"
UPDATE TABLENAME
SET CONFIRMED = @datenow
WHERE ID in (select cast(value as int) from openjson( @ids ) )";
尝试这个:
string queryString = @"UPDATE TABLENAME SET CONFIRMED = @datenow WHERE ID = @id";
SqlCommand command = new SqlCommand(queryString, connection, transaction);
command.Parameters.Add(new SqlParameter("@datenow", SqlDbType.DateTime));
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int));
command.Prepare();
foreach (int i in confirmCustomers)
{
command.Parameters["@id"].Value = i;
command.Parameters["@datenow"].Value = DateTime.Now;
command.ExecuteNonQuery();
}
您可以通过使用 string_split function 来使用表格方法,如下所示..
/* init query string */
string queryString = @"
UPDATE tbl
SET tbl.CONFIRMED = getdate()
FROM TABLENAME tbl
INNER JOIN (
SELECT ID FROM string_split(@ids, ',')
) ids
WHERE tbl.ID = ids.ID";
/* init command */
SqlCommand command = new SqlCommand(queryString, connection, transaction);
command.Parameters.Add(new SqlParameter("@ids", SqlDbType.Text, 4000));
command.Prepare();
/* init list of id */
List<int> ids = new List<int>();
/* update table for each confirm customers */
foreach (int i in confirmCustomers)
{
/* add id to list */
ids.add(i);
/* update 100 customer ids */
if (ids.Count == 100)
{
command.Parameters[0].Value = String.Join(",", ids);
command.ExecuteNonQuery();
/* reset list of id */
ids.Clear();
}
}
/* update remains customer id */
if (ids.Count > 0)
{
command.Parameters[0].Value = String.Join(",", ids);
command.ExecuteNonQuery();
}
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.