Przyspieszenie wkładek LINQ
Mam plik CSV i muszę go wstawić do bazy danych SQL Server. Czy istnieje sposób na przyspieszenie wstawiania LINQ?
Stworzyłem prostą metodę Repozytorium, aby zapisać rekord:
public void SaveOffer(Offer offer)
{
Offer dbOffer = this.db.Offers.SingleOrDefault (
o => o.offer_id == offer.offer_id);
// add new offer
if (dbOffer == null)
{
this.db.Offers.InsertOnSubmit(offer);
}
//update existing offer
else
{
dbOffer = offer;
}
this.db.SubmitChanges();
}
Ale dzięki tej metodzie program jest znacznie wolniejszy niż wstawianie danych za pomocą wstawek SQL ADO.net (nowe SqlConnection, nowe SqlCommand dla select if istnieje, nowe SqlCommand dla aktualizacji / insert).
W wierszach 100k csv trwa około godziny lub około 1 minuty na sposób ADO.net. Dla wierszy csv 2M zajęło ADO.net około 20 minut. LINQ dodał około 30k tych 2M wierszy w 25 minut. Moja baza danych ma 3 tabele, połączone w dbml, ale pozostałe dwie tabele są puste. Testy zostały wykonane przy wszystkich stołach pustych.
P.S. Próbowałem użyć SqlBulkCopy, ale muszę zrobić kilka transformacji w ofercie przed wstawieniem go do db i myślę, że pokonuje cel SqlBulkCopy.
Aktualizacje / Edycje: Po 18 godzinach wersja LINQ dodała tylko ~ 200K wierszy.
Przetestowałem import tylko za pomocą wkładek LINQ, a także jest bardzo powolny w porównaniu z ADO.net. Nie widziałem dużej różnicy między wstawkami / submitchanges i select / updates / insertts / submitchanges.
Nadal muszę spróbować wsadowego zatwierdzania, ręcznie łącząc się z db i skompilowanymi zapytaniami.