Eigenlijk, zoals je het hebt geschreven, zal je eerste optie sneller zijn.
-
Je tweede voorbeeld heeft een probleem. Je doet sql =+ sql + etc. Dit zorgt ervoor dat er voor elke iteratie van de lus een nieuw string-object wordt gemaakt. (Bekijk de StringBuilder-klasse). Technisch gezien ga je in eerste instantie ook een nieuw tekenreeksobject maken, maar het verschil is dat het niet alle informatie van de vorige tekenreeksoptie hoeft te kopiëren.
-
Zoals je het hebt ingesteld, zal SQL Server mogelijk een enorme vraag moeten evalueren wanneer je het uiteindelijk verzendt, wat zeker enige tijd zal duren om erachter te komen wat het zou moeten doen. Ik moet zeggen, dit is afhankelijk van hoe groot het aantal inserts dat je moet doen. Als n klein is, komt het waarschijnlijk goed, maar naarmate het groter wordt, wordt je probleem alleen maar erger.
Bulk-inserts zijn sneller dan individuele invoegtoepassingen vanwege de manier waarop SQL Server batchtransacties afhandelt. Als u gegevens uit C# gaat invoegen, moet u de eerste benadering nemen en elke 500 invoegingen in een transactie verpakken en deze vastleggen, dan de volgende 500 doen, enzovoort. Dit heeft ook het voordeel dat als een batch mislukt, u deze kunt vangen en kunt achterhalen wat er mis is gegaan en alleen die opnieuw kunt invoegen. Er zijn andere manieren om het te doen, maar dat zou zeker een verbetering zijn ten opzichte van de twee gegeven voorbeelden.
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;