sql >> Database >  >> RDS >> Sqlserver

Extreem langzaam opstarten van EF - 15 minuten

Met deze trucs heb ik de totale starttijd, veroorzaakt door EF, 3 keer weten te verkorten:

  1. Werk framework bij naar 6.2 en schakel modelcaching in :

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

    }

  2. Bel ctx.Database.Initialize() expliciet uit een nieuwe thread, zo vroeg mogelijk. Dit duurt nog steeds 3-4 seconden, maar omdat het naast andere dingen gebeurt, helpt het enorm.

  3. Laad entiteiten in de EF-cache in een redelijke volgorde.

Eerder schreef ik Include after Inlude, wat zich vertaalt in meerdere joins. Ik vond een "vuistregel" op sommige blogposts, dat tot twee geketende EF's redelijk goed presteren, maar elke meer vertraagt ​​alles enorm. Ik heb ook een blogbericht gevonden , die EF-caching liet zien:zodra een bepaalde entiteit is geladen met Include of Load, wordt deze automatisch in de juiste eigenschap geplaatst (blogauteur heeft het mis over het samenvoegen van objecten). Dus ik deed dit:

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

Dit is het ophalen van gegevens 6 keer sneller dan het opnemen van de vraag. Ik denk dat zodra entiteiten eerder zijn geladen, de EF-engine de database voor gerelateerde objecten niet aanroept, maar ze gewoon uit de cache haalt.

  1. Ik heb dit ook toegevoegd in mijn contextconstructor:

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

De effecten daarvan zijn nauwelijks merkbaar, maar kunnen een grotere rol spelen op een enorme dataset.

Ik heb ook dit bekeken presentatie van EF Core door Rowan Miller en ik zal er bij de volgende release op overschakelen - in sommige gevallen is het 5-6 keer sneller dan EF6.

Ik hoop dat dit iemand helpt




  1. Gegevens ophalen uit een vervolgkeuzelijst met meerdere selecties met PHP om in MySQL in te voegen

  2. Hoe maak je een mysql-tabel met de standaard huidige_datum van de kolomtijdstempel?

  3. Bewaar datum met optionele maand/dag

  4. SELECT SQL_CALC_FOUND_ROWS Query zeer traag groter dan 250000 records