sql >> Databasteknik >  >> RDS >> Sqlserver

Extremt långsam EF-start - 15 minuter

Jag lyckades minska den totala starttiden på grund av EF 3 gånger med dessa knep:

  1. Uppdatera ramverket till 6.2 och aktivera modellcache :

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

    }

  2. Anrop ctx.Database.Initialize() uttryckligen från ny tråd, så tidigt som möjligt. Detta tar fortfarande 3-4 sekunder, men eftersom det händer tillsammans med andra saker hjälper det mycket.

  3. Ladda enheter i EF-cache i rimlig ordning.

Tidigare skrev jag bara Inkludera efter Inlude, vilket översätts till flera sammanfogningar. Jag hittade en "tumregel" i vissa blogginlägg, att upp till två kedjade Includes EF presterar ganska bra, men varje gång saktar allt ner kraftigt. Jag hittade också ett blogginlägg , som visade EF-cache:när en given enhet laddats med Inkludera eller Ladda, kommer den automatiskt att placeras i korrekt egenskap (bloggförfattaren har fel om förening av objekt). Så jag gjorde så här:

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

Detta hämtar data 6 gånger snabbare än vad som ingår i frågan. Jag tror att när entiteter har laddats tidigare anropar EF-motorn inte databasen för relaterade objekt, den hämtar dem bara från cachen.

  1. Jag lade också till detta i min kontextkonstruktor:

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

Effekterna av det är knappt märkbara, men kan spela en större roll på enorma datamängder.

Jag har också sett denna presentation av EF Core av Rowan Miller och jag kommer att byta till den vid nästa utgåva - i vissa fall är det 5-6 gånger snabbare än EF6.

Hoppas detta hjälper någon




  1. MySQL Välj rader med en tangent eller fall tillbaka för att välja som standardnyckel

  2. Hur använder man insatt\raderad tabell i lagrad procedur?

  3. MS SQL ping extern server

  4. Använda OracleParameter med C# TimeSpan - Literal matchar inte