Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Extrem langsamer EF-Start - 15 Minuten

Mit diesen Tricks habe ich es geschafft, die durch EF verursachte Gesamtstartzeit um das Dreifache zu reduzieren:

  1. Aktualisieren Sie Framework auf 6.2 und aktivieren Sie Modell-Caching :

    öffentliche Klasse CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}

    }

  2. Rufen Sie ctx.Database.Initialize() auf explizit aus neuem Thread, so früh wie möglich. Das dauert immer noch 3-4 Sekunden, aber da es neben anderen Dingen passiert, hilft es sehr.

  3. Laden Sie Entitäten in angemessener Reihenfolge in den EF-Cache.

Früher habe ich einfach Include after Inlude geschrieben, was zu mehreren Joins führt. Ich habe in einigen Blog-Beiträgen eine "Faustregel" gefunden, dass bis zu zwei verkettete Includes EF ziemlich gut funktionieren, aber jedes weitere alles massiv verlangsamt. Ich habe auch einen Blogbeitrag gefunden , das EF-Caching zeigte:Sobald eine bestimmte Entität mit Include oder Load geladen wurde, wird sie automatisch in die richtige Eigenschaft eingefügt (der Blog-Autor irrt sich in Bezug auf die Vereinigung von Objekten). Also habe ich das gemacht:

  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();
            } 

Dadurch werden Daten 6-mal schneller abgerufen als von der Frage umfasst. Ich denke, sobald Entitäten zuvor geladen wurden, ruft die EF-Engine keine Datenbank für verwandte Objekte auf, sondern ruft sie nur aus dem Cache ab.

  1. Ich habe dies auch in meinem Kontextkonstruktor hinzugefügt:

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

Die Auswirkungen davon sind kaum wahrnehmbar, können aber bei großen Datenmengen eine größere Rolle spielen.

Ich habe mir auch dies angesehen Präsentation von EF Core von Rowan Miller und ich werde in der nächsten Version darauf umsteigen – in einigen Fällen ist es 5- bis 6-mal schneller als EF6.

Hoffe, das hilft jemandem