実際、あなたが書いた方法では、最初のオプションの方が高速です。
<オール> <リ>2番目の例には問題があります。 sql =+ sql + などを実行しています。これにより、ループの反復ごとに新しい文字列オブジェクトが作成されます。 (StringBuilder クラスを確認してください)。技術的には、最初のインスタンスでも新しい文字列オブジェクトを作成しますが、違いは、前の文字列オプションからすべての情報をコピーする必要がないことです。
<リ>あなたが設定した方法では、SQL Server は、最終的に送信するときに大量のクエリを評価する必要がある可能性があります。これは、何をすべきかを理解するのに間違いなく時間がかかります。これは、実行する必要がある挿入の数に依存します。 n が小さい場合はおそらく問題ありませんが、大きくなるにつれて問題は悪化するだけです。
一括挿入は、SQL サーバーがバッチ トランザクションを処理する方法により、個々の挿入よりも高速です。 C# からデータを挿入する場合は、最初のアプローチを取り、たとえば 500 回の挿入ごとにトランザクションにラップしてコミットし、次の 500 回などを実行する必要があります。これには、バッチが失敗した場合にそれらをトラップして、何が問題なのかを突き止め、それらだけを再挿入できるという利点もあります。他にも方法はありますが、提供されている 2 つの例よりも確実に改善されます。
var iCounter = 0;
foreach (Employee item in employees)
{
if (iCounter == 0)
{
cmd.BeginTransaction;
}
string sql = @"INSERT INTO Mytable (id, name, salary)
values ('@id', '@name', '@salary')";
// replace @par with values
cmd.CommandText = sql; // cmd is IDbCommand
cmd.ExecuteNonQuery();
iCounter ++;
if(iCounter >= 500)
{
cmd.CommitTransaction;
iCounter = 0;
}
}
if(iCounter > 0)
cmd.CommitTransaction;