Amélioration des performances d'insertion en masse du cadre d'entité : stratégies et références
L'insertion efficace de grands ensembles de données dans Entity Framework est cruciale pour éviter les goulots d'étranglement en termes de performances. Cet article aborde le défi de l'insertion de 4 000 enregistrements dans une transaction, un scénario sujet aux transactions incomplètes.
Éviter les pièges des SaveChanges()
appels fréquents
La principale perte de performances provient des appels répétés SaveChanges()
pour chaque enregistrement. Cette approche ralentit considérablement le processus. Voici comment optimiser :
1. Appel SaveChanges()
unique : Exécute un seul appel SaveChanges()
une fois tous les enregistrements ajoutés.
2. SaveChanges()
Appels par lots : Insérez les enregistrements par lots (par exemple, 100 ou 1 000) et appelez SaveChanges()
après chaque lot.
3. Élimination du contexte avec SaveChanges()
par lots : Combinez le traitement par lots avec la création d'un nouveau contexte de base de données après chaque SaveChanges()
appel. Cela clarifie le contexte, améliorant encore les performances.
Modèle d'insertion en masse optimisé :
Ce code illustre l'approche recommandée :
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { using (MyDbContext context = new MyDbContext()) { context.Configuration.AutoDetectChangesEnabled = false; int count = 0; int commitCount = 100; // Adjust as needed foreach (var entity in someCollection) { count++; context.Set<entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } context.SaveChanges(); } scope.Complete(); }</code>
Analyse des performances :
Des tests avec 560 000 entités (9 propriétés scalaires) ont donné ces résultats :
SaveChanges()
(compte de validation 1) : > 20 minutesSaveChanges()
(nombre de commits 1000) : 242 secondesSaveChanges()
avec élimination du contexte (nombre de validations 100) : 164 secondesConclusion :
En évitant les appels SaveChanges()
fréquents et en utilisant des insertions par lots avec élimination du contexte, des gains de performances significatifs sont obtenus dans les insertions groupées d'Entity Framework. Cette optimisation minimise le risque d'expiration des transactions et garantit un traitement efficace des données dans les transactions actives.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!