Maison > base de données > tutoriel mysql > Comment puis-je optimiser les insertions en masse dans Entity Framework pour améliorer les performances ?

Comment puis-je optimiser les insertions en masse dans Entity Framework pour améliorer les performances ?

Patricia Arquette
Libérer: 2025-01-23 21:52:10
original
718 Les gens l'ont consulté

How Can I Optimize Bulk Inserts in Entity Framework for Improved Performance?

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>
Copier après la connexion

Analyse des performances :

Des tests avec 560 000 entités (9 propriétés scalaires) ont donné ces résultats :

  • Incrémentiel SaveChanges() (compte de validation 1) : > 20 minutes
  • Par lots SaveChanges() (nombre de commits 1000) : 242 secondes
  • Lot SaveChanges() avec élimination du contexte (nombre de validations 100) : 164 secondes

Conclusion :

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal