En fait, la façon dont vous l'avez écrit, votre première option sera plus rapide.
-
Votre deuxième exemple a un problème. Vous faites sql =+ sql + etc. Cela va provoquer la création d'un nouvel objet chaîne pour chaque itération de la boucle. (Découvrez la classe StringBuilder). Techniquement, vous allez également créer un nouvel objet de chaîne en premier lieu, mais la différence est qu'il n'a pas à copier toutes les informations de l'option de chaîne précédente.
-
De la façon dont vous l'avez configuré, SQL Server devra potentiellement évaluer une requête massive lorsque vous l'enverrez finalement, ce qui prendra certainement un certain temps pour comprendre ce qu'il est censé faire. Je dois préciser que cela dépend de la taille du nombre d'insertions que vous devez faire. Si n est petit, tout ira probablement bien, mais à mesure qu'il grandit, votre problème ne fera qu'empirer.
Les insertions en bloc sont plus rapides que les insertions individuelles en raison de la façon dont le serveur SQL gère les transactions par lots. Si vous allez insérer des données à partir de C #, vous devez adopter la première approche et envelopper, disons, toutes les 500 insertions dans une transaction et la valider, puis faire les 500 suivantes et ainsi de suite. Cela a également l'avantage que si un lot échoue, vous pouvez les piéger et déterminer ce qui s'est mal passé et réinsérer uniquement ceux-ci. Il existe d'autres façons de le faire, mais ce serait certainement une amélioration par rapport aux deux exemples fournis.
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;