Всъщност, както сте го написали, първата ви опция ще бъде по-бърза.
-
Във втория ви пример има проблем. Вие правите sql =+ sql + и т.н. Това ще доведе до създаването на нов низов обект за всяка итерация на цикъла. (Вижте класа StringBuilder). Технически, вие също ще създадете нов обект на низ в първия случай, но разликата е, че не е необходимо да копирате цялата информация от предишната опция за низ.
-
Начинът, по който сте го настроили, SQL Server ще трябва потенциално да оцени масивна заявка, когато най-накрая я изпратите, което определено ще отнеме известно време, за да разберете какво трябва да прави. Трябва да кажа, че това зависи от това колко голям брой вмъквания трябва да направите. Ако n е малко, вероятно ще се оправите, но с нарастването проблемът ви само ще се влоши.
Груповите вмъквания са по-бързи от индивидуалните поради начина, по който SQL сървърът обработва пакетните транзакции. Ако възнамерявате да вмъкнете данни от C#, трябва да вземете първия подход и да увиете, да речем, всеки 500 вмъквания в транзакция и да я ангажирате, след това направете следващите 500 и така нататък. Това също има предимството, че ако партида се провали, можете да ги уловите и да разберете какво се е объркало и да вмъкнете отново само тях. Има и други начини да го направите, но това определено би било подобрение спрямо двата предоставени примера.
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;