Właściwie sposób, w jaki to napisano, pierwsza opcja będzie szybsza.
-
Twój drugi przykład ma w tym problem. Robisz sql =+ sql + itd. Spowoduje to utworzenie nowego obiektu tekstowego dla każdej iteracji pętli. (Sprawdź klasę StringBuilder). Technicznie rzecz biorąc, w pierwszej instancji również utworzysz nowy obiekt ciągu, ale różnica polega na tym, że nie trzeba będzie kopiować wszystkich informacji z poprzedniej opcji ciągu.
-
Sposób, w jaki to skonfigurowałeś, SQL Server będzie musiał potencjalnie ocenić ogromne zapytanie, kiedy w końcu je wyślesz, co z pewnością zajmie trochę czasu, aby dowiedzieć się, co ma zrobić. Powinienem stwierdzić, że zależy to od tego, jak dużą liczbę wkładek musisz zrobić. Jeśli n jest małe, prawdopodobnie wszystko będzie dobrze, ale w miarę wzrostu problem będzie się tylko pogarszał.
Wstawianie zbiorcze jest szybsze niż pojedyncze ze względu na sposób, w jaki serwer SQL obsługuje transakcje wsadowe. Jeśli zamierzasz wstawić dane z C#, powinieneś zastosować pierwsze podejście i zawinąć powiedz co 500 wstawek do transakcji i zatwierdź ją, a następnie wykonaj następne 500 i tak dalej. Ma to również tę zaletę, że jeśli partia się nie powiedzie, możesz je uwięzić i dowiedzieć się, co poszło nie tak, i ponownie wstawić tylko te. Można to zrobić na inne sposoby, ale z pewnością byłoby to ulepszeniem w porównaniu z dwoma podanymi przykładami.
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;