Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Démarrage EF extrêmement lent - 15 minutes

J'ai réussi à réduire le temps de démarrage total causé par EF 3 fois avec ces astuces :

  1. Mettez à jour le framework vers 6.2 et activez la la mise en cache du modèle :

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

    }

  2. Appelez ctx.Database.Initialize() explicitement à partir d'un nouveau fil, le plus tôt possible. Cela prend encore 3 à 4 secondes, mais comme cela se produit parallèlement à d'autres choses, cela aide beaucoup.

  3. Chargez les entités dans le cache EF dans un ordre raisonnable.

Auparavant, j'écrivais simplement Inclure après Inlude, ce qui se traduit par plusieurs jointures. J'ai trouvé une "règle empirique" sur certains articles de blog, selon laquelle jusqu'à deux EF inclus enchaînés fonctionnent plutôt bien, mais chacun ralentit tout massivement. J'ai également trouvé un article de blog , qui montrait la mise en cache EF :une fois que l'entité donnée a été chargée avec Inclure ou Charger, elle sera automatiquement placée dans la propriété appropriée (l'auteur du blog se trompe sur l'union des objets). Alors j'ai fait ça :

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

Cela récupère les données 6 fois plus rapidement que celles incluses dans la question. Je pense qu'une fois les entités préalablement chargées, le moteur EF n'appelle pas la base de données pour les objets associés, il les extrait simplement du cache.

  1. J'ai également ajouté ceci dans mon constructeur de contexte :

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

Les effets de cela sont à peine perceptibles, mais peuvent jouer un rôle plus important sur un énorme ensemble de données.

J'ai également regardé ceci présentation d'EF Core par Rowan Miller et j'y passerai lors de la prochaine version - dans certains cas, il est 5 à 6 fois plus rapide qu'EF6.

J'espère que cela aide quelqu'un