Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Avvio EF estremamente lento - 15 minuti

Sono riuscito a ridurre 3 volte il tempo di inizio totale causato da EF con quei trucchi:

  1. Aggiorna il framework a 6.2 e abilita il cache del modello :

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

    }

  2. Chiama ctx.Database.Initialize() esplicitamente dal nuovo thread, il prima possibile. Questo richiede ancora 3-4 secondi, ma poiché accade insieme ad altre cose, aiuta molto.

  3. Carica le entità nella cache EF in ordine ragionevole.

In precedenza, ho appena scritto Include after Inlude, che si traduce in più join. Ho trovato una "regola pratica" su alcuni post del blog, che fino a due Include EF concatenati si comportano piuttosto bene, ma ognuno di più rallenta tutto in modo massiccio. Ho anche trovato un post del blog , che mostrava la memorizzazione nella cache di EF:una volta che una determinata entità è stata caricata con Include o Load, verrà automaticamente inserita nella proprietà corretta (l'autore del blog ha torto sull'unione di oggetti). Quindi ho fatto questo:

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

Questo sta recuperando i dati 6 volte più velocemente di quanto include dalla domanda. Penso che una volta che le entità sono state caricate in precedenza, il motore EF non chiama il database per gli oggetti correlati, li ottiene semplicemente dalla cache.

  1. Ho anche aggiunto questo nel mio costruttore di contesto:

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

Gli effetti sono appena percettibili, ma possono svolgere un ruolo più importante su enormi set di dati.

Ho anche guardato questo presentazione di EF Core da parte di Rowan Miller e io passeremo ad esso nella prossima versione:in alcuni casi è 5-6 volte più veloce di EF6.

Spero che questo aiuti qualcuno