私のプロジェクトには、ADO.NET DataAdapter を使用して SQL テーブルを更新するメソッドがあります。
現在、これらのテーブルの一部は非常に大きくなり、おそらく 5000 行になり、いくつかのテーブルには数行のデータしか含まれません。私ができるようにしたいのは、DataTable のサイズに基づいて、各テーブルの最適な UpdateBatchSize を自動的に計算することです。
私がこれまでに取ったアプローチは、次の拡張メソッドを使用することです。
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;
}
}
これは機能しますが、小さなテーブルではパフォーマンスが低下しているようです。
完全を期すために、アダプターでサイズを設定する方法を次に示します。
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;
}
更新バッチのパフォーマンス上の利点については多くの推測があるようですが、最適な関係に関する具体的な事実はありません。低速で質の悪い接続で SQL Updates に問題があることがわかったので、これを可能な限り最適化する方法を検討しています。