Heim > Datenbank > MySQL-Tutorial > Warum ist der Operator „Contains()' von Entity Framework bei großen Datensätzen so langsam?

Warum ist der Operator „Contains()' von Entity Framework bei großen Datensätzen so langsam?

Linda Hamilton
Freigeben: 2025-01-24 07:21:12
Original
448 Leute haben es durchsucht

Why is Entity Framework's Contains() Operator So Slow with Large Datasets?

Entity Frameworks enthält (): Leistungs Engpass mit großen Datensätzen

Die Contains() -Methode von Entity Framework mit umfangreichen Datensätzen kann die Leistung stark beeinflussen. Dies ergibt sich aus seiner Übersetzung in eine Reihe von oder Aussagen innerhalb des generierten SQL, was beim Umgang mit zahlreichen Vergleiche ineffizient wird.

Betrachten Sie dieses Beispiel:

<code class="language-csharp">var ids = Main.Select(a => a.Id).ToArray();
var rows = Main.Where(a => ids.Contains(a.Id)).ToArray();</code>
Nach dem Login kopieren

Ein Vergleich mit einer 10.000-Rekord-Tabelle und einem 100-Elemente-Array kann bis zu 288-mal langsamer sein als eine einfache Linq-Abfrage, die alle Zeilen abholt. Die Grundursache liegt in dem mangelnden nativen ado.net -Unterstützung für Ausdrücke. EFs Problemumgehung - ein komplexer oder Expressionbaum - ist für große Eingangssätze rechenintensiv.

Lösungen und Strategien

Der optimale Ansatz besteht darin, den In() -Preiber zu nutzen, da er von ADO.NET -Anbietern nativ unterstützt wird, was zu effizienteren SQL führt.

Wenn In() nicht machbar ist, betrachten Sie diese Alternativen:

  • Optimieren Sie die Datenbankrundfahrten: Führen Sie anstelle einer großen Abfrage mehrere Abfragen mit kleineren Teilmengen der Vergleichsdaten aus.
  • Um kompilierte Abfragen (mit Vorbehalten) einsetzen: CompiledQuery erfordert grundlegende Datentypen. Um es mit Arrays oder IEnumerable zu verwenden, erstellen Sie eine benutzerdefinierte Funktion, die die Eingabe in einen grundlegenden Typ konvertiert (z. B. eine von Kommas getrennte Zeichenfolge). Diese konvertierte Zeichenfolge kann dann in einem CompiledQuery verwendet werden, der den In() -Operator verwendet.

nach vorne

Das Entity Framework -Team ist sich dieser Leistungsbeschränkung bewusst und untersucht die native Unterstützung für Ausdrücke im Anbietermodell. Diese Verbesserung würde die Leistung für große Datensätze erheblich verbessern. Contains()

Das obige ist der detaillierte Inhalt vonWarum ist der Operator „Contains()' von Entity Framework bei großen Datensätzen so langsam?. 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