Warum dauert die Berechnung eines Ausführungsplans so lange?

9

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.

Mongus Pong
quelle
1
Sind Sie sicher, dass die Planerstellung lange dauert und nicht nur Daten von der Festplatte in den Cache liest?
Mark Storey-Smith
1
Die Kompilierungszeit wird im Plan-XML selbst angezeigt. Haben Sie festgestellt, dass es definitiv Kompilierungszeit ist und nicht etwas anderes, z. B. eine synchrone automatische Aktualisierung von Statistiken? Auf welcher Version von SQL Server befinden Sie sich?
Martin Smith
@ MarkStorey-Smith Nun, ich bin mir über nichts wirklich sicher. Ich weiß, dass das Ausführen von DBCC FREEPROCCACHE , das nur diesen Plan-Cache löscht, die nächste Abfragezeit wieder auf bis zu 3 Minuten dauert.
Mongus Pong
@ MartinSmith Ah ja sehr nützlich, ich habe den visuellen Abfrageplan verwendet. Ja, die Kompilierungszeit entspricht ungefähr der gesamten Ausführungszeit der Abfrage. Wir sind auf SQL Server 2008 R2.
Mongus Pong
@MongusPong - Wenn Sie nur eine Statistikkopie der Produktionsdatenbank erstellen, können Sie diese in Ihrer Testumgebung reproduzieren? Wofür steht der Plan StatementOptmEarlyAbortReason?
Martin Smith

Antworten:

9

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

exec sp_updatestats

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)

Mongus Pong
quelle