Es gibt einige Möglichkeiten, die Neukompilierung einer gespeicherten Prozedur sicherzustellen:
- unter Verwendung von
WITH RECOMPILE
, - Machen Sie die gespeicherte Prozedur dynamisch (denken Sie an
exec()
) - Markierung des Prozesses für die Neukompilierung mit
sp_recompile
. - Ändern des Schemas, auf dem ein zwischengespeicherter Abfrageplan basiert
- Aufruf von
DBCC FREEPROCCACHE
- Auf Abfrageebene kann eine einzelne Anweisung innerhalb einer Prozedur mit dem RECOMPILE-Abfragehinweis (SQL 2008) neu kompiliert werden.
Faktoren bei der Neukompilierung
Abgesehen von den oben aufgeführten harten Faktoren, was verursacht die Neukompilierung von gespeicherten Prozeduren? Nun, viele Dinge. Einige davon sind mit der obigen Liste verwoben, aber ich möchte sie noch einmal vorstellen, weil es vielleicht nicht offensichtlich ist.
- Einfügen oder Löschen vieler Daten (Datendichte in Indizes und Tabellen steuert häufig Abfragepläne)
- Neuaufbau von Indizes (eine Änderung an zugrunde liegenden Objekten)
- Erstellen/Löschen temporärer Tabellen (wiederum zugrunde liegende DML-Änderungen).
- Abfrageplan veraltet (denken Sie daran, dass er in letzter Zeit nicht verwendet wurde, und SQL möchte die Speichernutzung bereinigen)
Dies ist keineswegs eine vollständige Liste. Der Abfrageoptimierer entwickelt sich weiter und überrascht, egal wie lange Sie SQL Server bereits verwenden. Aber hier sind einige Ressourcen, die nützlich sein könnten:
- Fehlerbehebung bei der Neukompilierung gespeicherter Prozeduren (ein Oldie, aber ein Goodie)
- Gespeicherte Prozeduren neu kompilieren
- Optimierung gespeicherter SQL Server-Prozeduren zur Vermeidung von Neukompilierungen
- Zwischenspeicherung und Wiederverwendung von Ausführungsplänen (unbedingt lesen)
ABER WARTE - ES GIBT MEHR!
Abgesehen davon ist die Vermutung in Ihrer Frage, dass Neukompilierungen immer schlecht für die Leistung sind. Tatsächlich ist die Neukompilierung oft gut.
Wann möchten Sie also, dass es neu kompiliert wird? Schauen wir uns ein Beispiel für eine Prozedur an, die nach Nachnamen sucht. Gespeicherte Prozeduren führen ein 'Parameter-Sniffing
durch ' was ein Segen ist (wenn es für dich funktioniert) und ein Fluch (wenn es gegen dich funktioniert). Führen Sie zuerst jemanden durch, der nach Zebr%
sucht für zerbrowski. Der Nachnamenindex erkennt, dass dies sehr spezifisch ist und gibt beispielsweise 3 Zeilen von einer Million zurück – also wird ein Ausführungsplan erstellt. Wenn die Prozedur für ein niedriges Zeilenergebnis kompiliert ist, ist die nächste Suche nach S%
. Nun, S ist Ihr gebräuchlichster Name und stimmt mit 93.543 Zeilen von 1 Million überein.