Faktisk, som du har skrevet det, vil din første mulighed være hurtigere.
-
Dit andet eksempel har et problem. Du laver sql =+ sql + osv. Dette vil forårsage, at et nyt strengobjekt bliver oprettet for hver iteration af løkken. (Tjek StringBuilder-klassen). Teknisk set kommer du også til at oprette et nyt strengobjekt i første omgang, men forskellen er, at det ikke behøver at kopiere al information fra den forrige strengindstilling over.
-
Som du har det sat op, bliver SQL Server potentielt nødt til at evaluere en massiv forespørgsel, når du endelig sender den, hvilket helt sikkert vil tage noget tid at finde ud af, hvad den skal gøre. Jeg bør sige, at dette afhænger af hvor stort antal indsatser du skal lave. Hvis n er lille, vil du sandsynligvis være okay, men efterhånden som den vokser, vil dit problem kun blive værre.
Masseindsættelser er hurtigere end individuelle på grund af, hvordan SQL-serveren håndterer batchtransaktioner. Hvis du skal indsætte data fra C#, bør du tage den første tilgang og ombryde sige hver 500 indsættelser i en transaktion og begå det, derefter gøre de næste 500 og så videre. Dette har også den fordel, at hvis en batch fejler, kan du fange dem og finde ud af, hvad der gik galt og genindsætte netop dem. Der er andre måder at gøre det på, men det ville helt klart være en forbedring i forhold til de to angivne eksempler.
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;