Szybkie tworzenie danych testowych do bazy danych MS SQL Server

0

Dzień dobry.
W jaki sposób przyspieszyć wstawienie dużej ilości danych testowych (generowanych w programie) do bazy MS SQL Server?

Generuję dane w programie - tworzę listę obiektów o losowych (załóżmy) wartościach właściwości. Generowanie 10 tys obiektów w pamięci zabiera: 0.1150115 sekundy.

Następnie w pętli foreach przechodzę przez całą listę i tworzę obiekty do zapisu do bazy (tutaj jest problem z tego co zauważyłem)

 
foreach (Line item in linieProd)
   {
   try
      {
      var linia = new lines { number = item.Numer, name = item.Nazwa, description = item.Opis,user_id = 1, creation_date = item.DataUtworzenia};              
      ctx.lines.Add(linia);
      }
      catch (Exception ex)
         {
         Console.WriteLine(ex.Message + "\n" + ex.InnerException.Message);
         }
      }

      ctx.SaveChanges();

Generowanie tych 10 tys. obiektów i zapis ich do bazy to około 340 sekund, kolejny insert paczki 10 tys. i kolejne 490 sekund.

Co by tu można zrobić, żeby przyspieszyć zapis do bazy?

1

Slowa kluczowe bulk load, bulk insert, 1-szy lepszy link: http://www.sqlpedia.pl/bulk-insert-import-danych-z-pliku-do-bazy-sql-server/ . Jak pracowalem pryz testach performance, to pakowanie danych do bazy wygladalo wlasnie tak ze generowalo sie skryptami pliki z wielka iloscia insertow i pozniej jakiegos rodzaju bulk load byl wolany.
Czestosc commitow mocna wplywa na wydajnosc - (czyli czy robisz commit po zapakowaniu kazdego rekordu czy np. co 10 000).

0

Z tego co widzę to czas generowania obiektów wchodzi tu w grę i chyba jak na razie niesłusznie zrzuciłem to na karb SQL Servera.

Z tymi commitami to już zorientowałem się by nie stosować po każdym insercie.

Okazuje się, że zmiana polegająca na dodaniu:

ctx.Configuration.AutoDetectChangesEnabled = false;

powoduje, że do bazy 10 tys obiektów trafia w ok. 5 sek.
Wrzucenie 100 tys. zajęło ok 50 sek. to już lepiej.

1

Ja bym użył prawdziwego ORMa i StatelessSession.

Znaczenie ma też całkowita liczba obiektów przypiętych do kontektu EF na raz. Z moich doświadczeń z przyspieszaniem EF wynika, że lepiej nie przekraczać 500.

0

Pewnie byłoby szybciej gdybym robił to w czystym ADO niż na leniucha ;).

1 użytkowników online, w tym zalogowanych: 0, gości: 1