Stimmt es, dass Statistiken nur beim Erstellen des Ausführungsplans für eine gespeicherte Prozedur verwendet werden und nicht im tatsächlichen Ausführungskontext verwendet werden?
Nein, der Ausführungsplan für eine gespeicherte Prozedur wird zwischengespeichert. Angenommen, es ist genügend Speicher verfügbar, um den Plan weiterhin zu speichern, ändert sich dies nur, wenn eine der folgenden Situationen eintritt (aus dem Zwischenspeichern und Wiederverwenden von Ausführungsplänen in der SQL Server-Dokumentation, Hervorhebung hinzugefügt):
- Änderungen an einer Tabelle oder Ansicht, auf die von der Abfrage verwiesen wird (ALTER TABLE und ALTER VIEW).
- Änderungen an einer einzelnen Prozedur, durch die alle Pläne für diese Prozedur aus dem Cache gelöscht werden (ALTER PROCEDURE).
- Änderungen an den vom Ausführungsplan verwendeten Indizes.
- Aktualisierungen der vom Ausführungsplan verwendeten Statistiken, die entweder explizit aus einer Anweisung wie UPDATE STATISTICS generiert oder automatisch generiert werden.
- Löschen eines vom Ausführungsplan verwendeten Index.
- Ein expliziter Aufruf von sp_recompile.
- Große Anzahl von Änderungen an Schlüsseln (generiert durch INSERT- oder DELETE-Anweisungen anderer Benutzer, die eine Tabelle ändern, auf die von der Abfrage verwiesen wird).
- Bei Tabellen mit Triggern, wenn die Anzahl der Zeilen in den eingefügten oder gelöschten Tabellen erheblich zunimmt.
- Ausführen einer gespeicherten Prozedur mit der Option WITH RECOMPILE.
Wenn die Statistiken aktualisiert werden, berücksichtigt der zwischengespeicherte Plan automatisch die neuen Statistiken und wird neu kompiliert.
Wie verhindern Sie, dass Ausführungspläne veralten, wenn täglich hunderttausend Zeilen hinzugefügt werden?
Eine Möglichkeit ist, wenn die Tabelle, wie oben erwähnt, viele Aktualisierungen enthält. Einige hunderttausend geänderte Zeilen können diese Bedingung erfüllen. Aber wenn Sie sicher sein oder eine genauere Kontrolle haben möchten: indem Sie Ihre Statistiken aktualisieren. Sie können SQL Server erlauben, Statistiken automatisch zu erstellen und zu verwalten oder dies manuell selbst zu tun. Weitere Informationen zu beiden Methoden finden Sie unter SQL Server Auto Update und Auto Create Statistics Options . Wenn Sie eine wöchentliche Neuerstellung von Indizes durchführen, werden auch die zu aktualisierenden Pläne ausgelöst. Führen Sie einige Tests durch, um festzustellen, was für Sie am vorteilhaftesten ist, da eine zu häufige Aktualisierung der Statistiken möglicherweise keine echten Leistungsergebnisse liefert.
Wenn wir Statistiken häufig aktualisieren, um dieses Problem zu bekämpfen, ist es sinnvoll, den Hinweis OPTION (RECOMPILE) für die Abfrage dieser gespeicherten Prozedur zu verwenden?
Sie müssen nicht brauchen zu verwenden RECOMPILE
, aus dem Auszug seit basierend oben Sie , dass der Ausführungsplan entsprechend aktualisiert wird sehen können , wenn neue Statistiken zur Verfügung stehen. Möglicherweise ist eine Aktualisierung der Tagesendstatistik in Ordnung (wenn Sie wirklich besorgt sind), aber ich denke nicht, dass dies aufgrund Ihrer bisherigen Aussagen ausdrücklich erforderlich ist. Ich würde es jedoch erneut testen, um festzustellen, welche Auswirkungen dies auf die Leistung Ihrer gespeicherten Prozedur haben kann, und entsprechend planen.
RECOMPILE
würde sowieso kein Statistik-Update verursachen.