Einer unserer Kunden hat gerade ein Upgrade auf einen neuen Server durchgeführt.
Die Ausführung einer bestimmten gespeicherten Prozedur dauert beim ersten Ausführen mehr als drei Minuten. Nachfolgende Läufe dauern weniger als 1 Sekunde.
Dies lässt mich glauben, dass die ersten drei Minuten in erster Linie für die Berechnung des Ausführungsplans benötigt werden. Nachfolgende Läufe verwenden dann einfach den zwischengespeicherten Plan und werden sofort ausgeführt.
In unseren Testdatenbanken dauert es ungefähr 5 Sekunden, um den Plan für dasselbe Verfahren zu berechnen.
Ich sehe im Plan selbst nichts Schreckliches - obwohl ich mir nicht vorstelle, dass es relevant ist, da der Plan zeigt, wie lange es dauert, die Abfrage auszuführen, und sich nicht selbst berechnet.
Der Server ist ein 16-Kern mit 24 GB Speicher. Es tritt keine hohe CPU- oder Speicherlast auf.
Was kann eine so langsame Berechnung nur für eine bestimmte Datenbank verursachen?
Welche Schritte kann ich unternehmen, um die Ursache des Problems zu finden?
Bearbeiten
Ich habe es also geschafft, auf den Server zuzugreifen und die Abfrage mit SET SHOWPLAN_XML ON auszuführen .
Ich kann bestätigen, dass die CompileTime für die Abfrage 99% der Ausführungszeit der Abfrage beansprucht. Die AnweisungOptmEarlyAbortReason lautet "TimeOut" . In unserer Testdatenbank mit einer Kopie ihrer Datenbank lautet der Grund MemoryLimitExceeded.
quelle
StatementOptmEarlyAbortReason
?Antworten:
Ich hasse es, meine eigene Frage zu beantworten, zumal ich so viel Hilfe von anderen hatte, um die Lösung zu erarbeiten, aber hier geht es weiter.
Das Problem war auf einige Blindgängerstatistiken in der Datenbank zurückzuführen. Mit Blick auf den Ausführungsplan erwartete der Optimierer 11,5 TB Daten, die von der Abfrage zurückgegeben wurden. In Wirklichkeit erhielt 87kb. Ich weiß jetzt, dass große Abweichungen zwischen erwarteten und tatsächlich zurückgegebenen Zeilen ein Zeichen dafür sind, dass die Statistiken veraltet sind.
Einfach laufen
zwingt die Datenbank, die Statistiken für alle Tabellen zu aktualisieren.
Dies hat die Ausführungszeit der Abfrage von 3 Minuten auf 6 Sekunden verkürzt. Jeder ein Gewinner!
Vielen Dank für all die Hilfe Jungs. : 0)
quelle