C# 如何动态计算ADO.NET DataAdapter的最佳UpdateBatchSize
我的项目中有一个方法,它使用ADO.NET数据适配器更新我的SQL表 现在,其中一些表可能相当大,可能有5000行,而有些表只包含几行数据。我希望能够根据DataTable的大小自动计算每个表的最佳UpdateBatchSize 到目前为止,我采用的方法是使用以下扩展方法:C# 如何动态计算ADO.NET DataAdapter的最佳UpdateBatchSize,c#,ado.net,C#,Ado.net,我的项目中有一个方法,它使用ADO.NET数据适配器更新我的SQL表 现在,其中一些表可能相当大,可能有5000行,而有些表只包含几行数据。我希望能够根据DataTable的大小自动计算每个表的最佳UpdateBatchSize 到目前为止,我采用的方法是使用以下扩展方法: public static void SetBatchUpdateSize(this DbDataAdapter adapter, int rowCount) { if (rowCount <= 5)
public static void SetBatchUpdateSize(this DbDataAdapter adapter, int rowCount)
{
if (rowCount <= 5)
{
adapter.UpdateBatchSize = 5;
}
else if (rowCount <= 1000)
{
adapter.UpdateBatchSize = rowCount/2;
}
else
{
adapter.UpdateBatchSize = 500;
}
}
似乎有很多关于更新批处理的性能好处的推测,但没有关于最佳关系的具体事实。我发现SQL更新速度慢,连接质量差,因此我正在寻找尽可能优化的方法。如果一次更新的updatebatchsize比一次更新的updatebatchsize更大,那么大量数据必须通过网络传输,因此非常大的updatebatchsize没有多大区别。相比之下,尺寸越小性能越好。这并不能真正回答问题。连接速度、批量大小和表大小之间的关系是什么。我如何才能在不选择一些任意值并希望得到最好结果的情况下得到最佳解决方案。你说小号的效果更好,但事实显然不是这样。如果我在by table中有1000行,batchsize为2,那么我最终会调用500个SQL,显然效率不高。
var db = dbAccessLayer.CreateConnection();
try
{
adapter.SelectCommand.Connection = db;
adapter.SelectCommand.Connection.Open();
adapter.SelectCommand.Transaction = transaction;
SetTimeout(timeout);
adapter.SetBatchUpdateSize(dataTable.Rows.Count);
int result = adapter.Update(Table);
adapter.SelectCommand.Transaction = null;
return result;
}
catch (Exception)
{
dataTable.RejectChanges();
throw;
}