Entity Framework dauert etwa 30 Sekunden, auf die erste Abfrage

Bin ich mit Entity Framework 6, die auf einer SQL Server-Datenbank für die Abfrage einer bestehenden Datenbank (Datenbank-erste, es gibt also eine EDMX in meinem Projekt).

Habe ich bemerkt, dass das erste mal, dass ich Anfrage auf ein Unternehmen, es kann bis zu dreißig Sekunden für die Abfrage ausgeführt werden. Nachfolgende Abfragen auf das gleiche Objekt dann fertig bekommen in einer Angelegenheit von Millisekunden. Die eigentliche SQL ausgeführt wird, ist sehr schnell, so dass es nicht eine langsame Abfrage.

Habe ich herausgefunden, dass Entity Framework generiert Ansichten über den hintergrund und, dass dies die wahrscheinlichste Ursache. Was ich noch nicht gefunden, jedoch ist eine gute Lösung für dieses. Es gibt ein NuGet-package, die mit der View-Generierung (EFInteractiveViews), aber es wurde nicht aktualisiert, seit 2014 und ich kann kaum scheinen, um herauszufinden, alle Informationen auf, wie es zu benutzen.

Welche Möglichkeiten habe ich heute? Ich habe versucht zu initialisieren Entity Framework auf der Application_Start-ein paar Abfragen, aber das scheint nicht zu helfen, viel überhaupt, und auch es ist ziemlich schwer zu führen die real-Abfragen auf Application_Start, weil die meisten Abfragen, die Daten des aktuellen Benutzers (wer ist noch nicht angemeldet bei Application_Start), so ist es schwierig, diese im Voraus.

Habe ich mir Gedanken über die Erstellung einer ashx-Datei, die ständig abfragt, die für die Anwendung durch Aufruf der API und lebendig zu halten. Habe ich auch den Anwendungspool „AlwaysRunning“, so dass EF gar nicht starten, wenn der app-pool recycled wird.

Hat jemand irgendwelche Tipps oder Ideen, wie kann ich dies beheben, oder Dinge, die ich versuchen kann?

Vielen Dank im Voraus. Ich verbrachte den besseren Teil von zwei Tagen bereits die Suche nach einer geeigneten Lösung.

  • Welche db verwendest du?
  • Oh sorry, SQL Server. Ich werde aktualisieren, meine Frage
  • Sie könnten versuchen, deaktivieren Sie die proxy-Erstellung mit myContext.Configuration.ProxyCreationEnabled = false;. Ich persönlich deaktivieren lazy loading so explizit mit dem code, also habe ich auch myContext.Configuration.LazyLoading = false;
  • danke für die Anregung. Welche Auswirkungen hat dies auf lazy loading? Ich habe gelesen, bis auf die proxy-Erstellung gerade jetzt und wie es scheint, wird dies nun nicht mehr (optimal) funktioniert. Irgendwelche Ideen?
  • Lazy loading erlaubt das verzögerte laden von verknüpften Entitäten. Also könnte man tun, MyUser.Account (Konto, wo ist eine andere Person) ohne speziell be-Konto (sobald Sie tun .Konto der DB Treffer wieder). Scheint wie eine tolle Idee, aber für mich gibt es keinen Ersatz für die Beantragung genau, was Sie wollen in 1 Anruf anstatt eine Reihe von latenten Zugriffe auf die DB.
  • Ich hatte ein ähnliches Problem mit einer ASP.NET web-app, die der ersten EF-Abfragen dauern würde, 20-35 Sekunden – in der Regel nach einer frischen bereitstellen, oder wenn der app-pool hatten, wurden recycelt. Ich verbrachte eine Menge Zeit, profiling und versuchen, es zu beschleunigen, ohne viel Erfolg am Ende. Es scheint, dass dieser Zeitaufwand ist von EF Gebäude, bis es die in-memory-Modell, das es braucht, um laufen Ihre Fragen – und ich habe noch keinen Weg gefunden, dies „on demand“; z.B. direkt nach einem bereitstellen, bevor die erste Anfrage dieser web-site
  • Sie können „warm up“ der Website, aber eine bessere Idee wäre, zu brechen, das Modell in kleinere, Szenario-spezifische Modelle.
  • Ich habe versucht, die „site-warm-up“, das funktionierte OK für lookup-Tabellen (caching, deren Werte in .NET-cache), aber es hat nicht wirklich etwas tun, zur Senkung der EF startup-Zeit für die erste Abfrage ….



2 Replies
  1. 3

    Gibt es viele Verfahren zu beschleunigen, Entity Framework, ich erwähne einige von Ihnen

    1. Schalten Sie das LazyLoading (EDMX => öffnen Sie die Datei rechts-Klick => Eigenschaften => Lazy Loading Enabled auf false gesetzt )

    2. Verwenden AsNoTracking().ToList() und wenn Sie aktualisieren möchten, verwenden Sie Attach – und update-Status des Objektes zu EntityState.Modified

    3. Verwenden Indexes auf Ihrem Tisch

    4. Verwenden Paging, laden nicht alle Daten auf einmal

    5. Teilen Sie Ihre Edmx in viele kleinere, enthalten nur diejenigen, die Sie benötigen auf Ihrer Seite, ( dies wird die Wirkung der Leistung auf die gute Weise)

    6. Wenn Sie möchten, laden Sie Verwandte Objekte „eifrig sein und nicht faul“, verwenden Sie Include ließe sich auch using System.Data.Entity zu verwenden, die lambda-Funktionen umfassen, die

    Beispiel für die Aufteilung Ihrer Edmx

    Wenn Sie die folgenden Objekte für eine Miete eine Auto-app : Country, City , Person, Car, Rent, Gender, Engine, Manufacturers,..etc.

    Nun

    • Wenn Sie arbeiten auf einem Bildschirm zu Verwalten (CRUD) person, das heißt, Sie brauchen nicht Auto,Mieten,Hersteller, erstellen Sie also ManagePerson.edmx enthält ( Country, City, Person, Gender)

    • Wenn Sie arbeiten, verwalten (CRUD) Auto dann brauchen Sie nicht (Person,Stadt, Geschlecht,Miete), so können Sie ManageCar.edmx mit ( Car, Manufacturer,Country, Engine)

    • Nicht sicher, ob ich den Punkt sehen, der Aufspaltung der EDMX-up. AFAIK Nichts, es funktioniert alles, bis aufgerufen.
    • Ich kann versichern, dass zumindest der Punkt 5, Spaltung EDMX in vielen smallar edmx-Minimierung der Aufheizzeit, getestet habe ich dies mit der code-first-Ansatz, ich hatte DbContext mit 600+ DBSets , ich habe rund 50 DbConext jede dient einem separaten Kontext, der erste Lauf Wartezeit sank um 70%
    • Vielen Dank für diese Vorschläge. Ich freue mich in einige von Ihnen, aber eine schnelle Frage: arbeiten Sie mit mehreren EDMX ist, ist es das gleiche wie das arbeiten mit mehreren Diagrammen? Ich kann wählen Sie ein Element in der edmx-Datei und wählen Sie „zu einem neuen Diagramm verschieben“. Wird dies alles tun?
    • wenn man sich unter EDMX im generierten code .cs, finden Sie DBSets und geerbt von DBContext, die Anzahl der DBSets sein sollte, das minimum zu dienen Ihrem Kontext, zu Ihrer Frage, ich bin weit Weg von den Test-Maschine, aber wie ich bereits erwähnt, wenn Sie die Einheit zu ein anderes Diagramm entfernen DbSet code aus dem ersten Diagramm generiert code, dann ja, sonst Nein.
  2. 1

    Entity Framework muss zunächst kompilieren und übersetzen Ihre LINQ-Abfragen in SQL, aber danach ist es dann speichert Sie. Der erste Treffer zu einer Abfrage ist immer noch eine lange Zeit, aber wie Sie erwähnen nach, dass die Abfrage laufen sehr schnell.

    Wenn ich zuerst verwendet, EF-es war ständig ein Thema gebracht durch Tester, aber wenn das system live ging, und wurde Häufig verwendet wird (und Abfragen zwischengespeichert wurden) war es kein Problem.

    Sehen Hadi Hassans Antwort für den Allgemeinen speed-up-Tipps.

    • Ich weiß. 30 Sekunden ist eine riesige Menge an Zeit (und versuchen Sie zu erklären, dass an Ihre Endkunden). Auch dieser 30-Sekunden-trifft, scheint mehr oder weniger jedesmal, wenn eine neue Entität abgefragt wird. Ich zum Beispiel, haben eine Organisation. Das erste mal, dass jemand versucht, um die Liste der Organisationen, gibt es einen 30-Sekunden-Treffer. Es gibt auch eine Liste der Publikationen, die sich mit genau demselben problem, unabhängig davon, ob oder nicht die Organisationen haben bereits geladen wurden. Die Ladezeit variiert, aber es ist in der Regel etwa 20 – 30 Sekunden pro Person
    • vermutlich haben Sie ein sehr großes Modell. Das ist in der Regel eine schlechte Idee, so ein Modell sollte nur enthalten, was relevant ist für ein bestimmtes Szenario. Sollte es nicht eine Karte von der gesamten domain. Es ist nicht nur für die Leistung, die ein großes Modell, das versucht, decken alle Szenarien, wird am Ende-mapping und dem laden eine Menge nutzloser Daten
    • Das klingt wie nicht das Modell, aber der query-Erstellung nimmt den Großteil Ihrer Zeit. Da vorkompilierte Abfragen werden nicht unterstützt, da die Einführung von DbContext, könnten Sie versuchen, ausführen (und daher auch kompilieren) der Abfragen – nicht unbedingt mit einem Ergebnis von Daten – bei der Initialisierung, oder wenn es nicht zu viel Last auf die Anwendung/asynchron.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.