Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Niezwykle wolne uruchamianie EF — 15 minut

Udało mi się skrócić całkowity czas startu spowodowany przez EF 3 razy dzięki tym sztuczkom:

  1. Zaktualizuj framework do wersji 6.2 i włącz buforowanie modelu :

    public class CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}

    }

  2. Wywołaj ctx.Database.Initialize() wyraźnie z nowego wątku, tak wcześnie, jak to możliwe. To nadal zajmuje 3-4 sekundy, ale ponieważ dzieje się to razem z innymi rzeczami, bardzo pomaga.

  3. Załaduj jednostki do pamięci podręcznej EF w rozsądnej kolejności.

Wcześniej napisałem po prostu Include po Inlude, co przekłada się na wielokrotne sprzężenia. Znalazłem "zasadę" w niektórych postach na blogu, że do dwóch połączonych EF działa całkiem dobrze, ale każdy kolejny znacznie spowalnia wszystko. Znalazłem też post na blogu , który pokazał buforowanie EF:po załadowaniu danej encji za pomocą opcji Include lub Load zostanie ona automatycznie umieszczona we właściwej właściwości (autor bloga myli się co do unii obiektów). Więc zrobiłem to:

  using (var db = new MyContext())
            {
                db.Fields.Load();
                db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
                db.FieldValues.Load();
                return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
            } 

Pobiera to dane 6 razy szybciej niż obejmuje z pytania. Myślę, że po wcześniejszym załadowaniu encji silnik EF nie wywołuje bazy danych dla powiązanych obiektów, po prostu pobiera je z pamięci podręcznej.

  1. Dodałem to również w moim konstruktorze kontekstu:

        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    

Efekty tego są ledwo zauważalne, ale mogą odgrywać większą rolę w ogromnym zbiorze danych.

Oglądałem też to prezentacja EF Core autorstwa Rowana Millera i przejdę na niego w następnym wydaniu - w niektórych przypadkach jest 5-6 razy szybszy niż EF6.

Mam nadzieję, że to komuś pomoże




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie o dane struktury drzewa w SQL Server

  2. jak wstawić datetime do tabeli SQL Database?

  3. Sprawdź miejsce używane przez tabelę w SQL Server

  4. Przedstawiamy nową funkcję — replikację Spotlight w chmurze

  5. Nie mogę uruchomić przeglądarki SQL Server