Heim > Datenbank > MySQL-Tutorial > Wie kann ich die Leistung von Masseneinfügungen im Entity Framework optimieren?

Wie kann ich die Leistung von Masseneinfügungen im Entity Framework optimieren?

Patricia Arquette
Freigeben: 2025-01-23 21:57:09
Original
802 Leute haben es durchsucht

How Can I Optimize Bulk Insertion Performance in Entity Framework?

Detaillierte Erläuterung der Optimierung der Stapeleinfügungsleistung von Entity Framework

Das Einfügen großer Datenmengen in eine Datenbank mithilfe von Entity Framework kann eine herausfordernde Aufgabe sein. Insbesondere wenn innerhalb eines Transaktionsbereichs gearbeitet wird und das Datenvolumen 4000 Datensätze überschreitet, kann es zu unvollständigen Transaktionen kommen.

Um dieses Problem zu beheben, ist es wichtig zu verstehen, dass der Aufruf von SaveChanges() für jeden Datensatz die Leistung erheblich beeinträchtigen kann. Es wird empfohlen, die folgenden Optimierungsstrategien anzuwenden:

  1. Rufen Sie SaveChanges() auf einmal auf: Anstatt SaveChanges() nach dem Speichern jedes Datensatzes aufzurufen, akkumulieren Sie Änderungen und speichern Sie sie alle auf einmal, nachdem alle Datensätze verarbeitet wurden.

  2. Batch SaveChanges(): Wenn das Speichern aller Datensätze auf einmal immer noch zu langsam ist, sollten Sie SaveChanges() für jede bestimmte Anzahl von Datensätzen (z. B. 100) aufrufen.

  3. Kontexte regelmäßig erstellen und freigeben: Wenn Sie Änderungen stapelweise verarbeiten, sollten Sie erwägen, einen neuen Kontext zu erstellen und den vorhandenen Kontext nach jedem Stapel freizugeben, um die angesammelten Entitäten im Kontext zu löschen.

  4. Änderungserkennung deaktivieren: Durch die Deaktivierung der automatischen Änderungserkennung kann sich Entity Framework auf das Einfügen neuer Datensätze konzentrieren, ohne Zeit mit der Nachverfolgung von Änderungen zu verbringen.

Codebeispiel:

<code class="language-csharp">using (TransactionScope scope = new TransactionScope())
{
    using (var context = new MyDbContext())
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        foreach (var entity in entities)
        {
            ++count;
            context.Set<MyEntity>().Add(entity); // 使用更明确的类型

            if (count % 100 == 0)
            {
                context.SaveChanges();
            }
        }

        context.SaveChanges(); // 保存剩余的记录
    }

    scope.Complete();
}</code>
Nach dem Login kopieren

Leistungsbenchmark:

Für den Test mit 560.000 Entitäten wurden folgende Benchmark-Ergebnisse beobachtet:

  • Anzahl der Commits: 1, Kontext neu erstellen: Nein: Mehr als 20 Stunden
  • Anzahl der Commits: 100, Kontext neu erstellen: Nein: Mehr als 20 Minuten
  • Anzahl der Commits: 1000, Kontext neu erstellen: Nein: 242 Sekunden
  • Anzahl der Commits: 10, Kontext neu erstellen: Ja: 241 Sekunden
  • Anzahl der Commits: 100, Kontext neu erstellen: Ja: 164 Sekunden

Diese Optimierungen verbessern die Leistung erheblich und stellen das erfolgreiche Einfügen großer Datensätze innerhalb der Transaktions-Timeout-Grenzen sicher. Die Auswahl einer geeigneten Stapelgröße und die Frage, ob der Kontext neu erstellt werden soll, erfordern eine Abstimmung und Tests auf der Grundlage tatsächlicher Umstände.

Das obige ist der detaillierte Inhalt vonWie kann ich die Leistung von Masseneinfügungen im Entity Framework optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage