EF6 SQLQuery ist sehr langsam, aber die Datenbank ist sehr schnell

9

Ich habe ein Performance-Problem, wir haben eine Reihe von Analysen durchgeführt und stecken fest. Hoffentlich hat einer von euch das schon einmal gesehen.

Ich rufe DbContext.Database.SqlQuery an, der Datenbankbereich dauert 3 ms, aber die vollständige Ausführung dauert 9 Sekunden.

Wir haben EF Profiler verwendet, um dies zu erkennen, und wir führen SQL auch direkt in SQL Server Management Studio aus, und zwar sofort.

Wir haben auch einen flüchtigen Blick genommen und konnten nicht tief genug in den Prozess sehen.

Der Ergebnistyp ist keine Entität aus dem Modell und wir sind daher zuversichtlich, dass das Tracking nicht beteiligt ist.

Wir wissen auch, dass dies nicht die erste Abfrage ist, die für den Kontext ausgeführt wird, daher zahlen wir keine EF-Startkosten für diese Abfrage.

Wir haben den .net Profiler ausprobiert und hatten so viele Probleme damit, dass wir entschieden haben, dass wir einfach fragen sollten.

Irgendwelche Tipps zum Eingraben und herausfinden?

EDIT: Das Ergebnis für diese Abfrage ist 1 Zeile mit 4 Spalten (dezimal)

Die Codezeile ist nur:

%Vor%

Die SQL selbst ist keine sehr lange Zeichenfolge. Wir werden einen detaillierteren Profiler verwenden, um herauszufinden, wo dieser Prozess aufhört.

    
RandyDes 06.08.2015, 20:01
quelle

2 Antworten

1
  

Wir haben den EF-Profiler verwendet, um dies zu erkennen, und wir führen auch SQL aus   direkt im SQL Server Management Studio und es ist sofort.

Das beweist nichts. Die Abfrage wird möglicherweise schnell ausgeführt, aber die Daten können zu 100 MB Daten führen, die dann zum Client transportiert und in Objekten materialisiert werden. Dies kann mehr Zeit in Anspruch nehmen als Sie denken.

Die Abfrage in SSMS kann sofort zurückkehren, da nur ein Teil der Daten angezeigt wird. Sie haben nicht gesagt, was die Daten waren.

Verwenden Sie einen echten .NET Profiler, wie dotTrace oder Ants. Auf diese Weise können Sie sehen, wo genau die Zeit verloren geht. EF Prof (oder mein eigener ORM Profiler: Ссылка ) wird Ihnen sagen, welcher Teil der gesamten Route genommen wurde (ORM- & gt; DB- & gt; ORM) braucht Zeit. Sogar EF prof macht das;)

    
Frans Bouma 06.08.2015 20:49
quelle
1

Wenn der Kunde aus irgendeinem Grund einen Profiler nicht verwenden kann, wie Frans es vorschlägt, müssen Sie das Ratespiel spielen und Möglichkeiten ausschließen.

Zunächst einmal denke ich, dass eine wichtige Information fehlt. Dauert es immer etwa 9 Sekunden oder variiert es?

Erster Schritt:

Entscheiden Sie, ob die Verzögerung vor oder nachdem die Abfrage die Datenbank erreicht hat. Sollte es möglich sein, entweder mit EF Profiler zu tun und die Zeitstempel in Sql Profiler zu betrachten.

In beiden Fällen werden Sie die Möglichkeiten ein wenig eingeschränkt haben.

Zweiter Schritt:

Schließen Sie so viel wie möglich aus

  • Indizes (Nein, die Abfrage ist schnell)
  • Zu viele Daten zurückgeben (Nein, je nach den Informationen, die Sie haben)
  • Langsame Abfragekompilierung (Nein, rohe SQL-Abfrage wird verwendet)
  • Langsame Datenübertragung (Nein, die anderen Abfragen funktionieren gut)
  • Langsame DbContext-Initialisierung (Nein, Sie sagten, es ist nicht die erste Abfrage)
  • Zeilen- oder Tabellensperren (nicht wahrscheinlich, das würde wahrscheinlich als lange laufende Abfrage im Profiler angezeigt werden)
  • Langsame Materialisierung (Nein, zu wenigen Feldern, es sei denn, es gibt einen ernsthaften Randfallfehler)

Dritter Schritt:

Was ist übrig? Das hängt von der Antwort auf # 1 ab und auch wenn es immer 9 Sekunden ist.

Meine Hauptverdächtigen hier sind entweder ein Verbindungsproblem, weil ein anderer Anruf blockiert, so dass er auf eine Verbindung oder einen Second-Level-Cache warten muss oder etwas, das nicht gut mit dieser Abfrage funktioniert.

Um einige weitere Alternativen auszuschließen, würde ich versuchen, dieselbe Abfrage unter Verwendung von normalem alten ADO.NET auszuführen. Wenn das Problem weiterhin besteht, wissen Sie, dass es sich nicht um ein EF-Problem und sehr wahrscheinlich um ein Verbindungsproblem handelt. Wenn es weggeht, könnte es immer noch beide Probleme geben.

Nicht so sehr als Antwort, sondern als hoffentlich etwas, woran Sie nicht schon gedacht haben.

    
Mikael Eliasson 07.08.2015 21:36
quelle