Als Faustregel gilt, wenn WITH RECOMPILE-Option verwenden
-
05-07-2019 - |
Frage
Ich verstehe, dass die Option WITH RECOMPILE das Optimierungsprogramm zwingt den Abfrageplan für gespeicherte Prozeduren wieder aufbauen, aber wenn würden Sie das passieren soll?
Was sind einige Faustregeln, wenn die WITH RECOMPILE-Option verwenden und wann nicht?
Was ist der effektive Aufwand im Zusammenhang mit nur es auf jedem sproc setzen?
Lösung
Wie andere gesagt haben, wollen Sie nicht einfach in jede gespeicherte Prozedur als eine Frage der Gewohnheit umfassen WITH RECOMPILE
. Auf diese Weise würden Sie einen der wichtigsten Vorteile von Stored Procedures werden eliminiert: die Tatsache, dass es die Abfrage-Plan spart.
Warum ist das potenziell eine große Sache? Abfrage-Plan-Computing ist viel intensiver als regelmäßigen prozeduralen Code zu kompilieren. Da die Syntax einer SQL-Anweisung nur spezifiziert was Sie wollen, und nicht (in der Regel) wie , um es zu bekommen, dass die Datenbank ein hohes Maß an Flexibilität erlaubt es bei der Erstellung der physikalischen Plan (das heißt, die Anweisungen Schritt-für-Schritt, um tatsächlich zu sammeln und modifizieren Daten). Es gibt viele „Tricks“ die Datenbankabfrage Vorprozessor tun können und Entscheidungen kann es machen - welcher Reihenfolge die Tabellen zu verknüpfen, die Indizes zu verwenden, ob WHERE
Klauseln anzuwenden vor oder nach dem beitritt, usw.
Für eine einfache SELECT-Anweisung kann es keinen Unterschied machen, sondern für jede nicht-triviale Abfrage, die Datenbank wird einige ernste Zeit verbringen (in Millisekunden gemessen, wie die üblichen Mikrosekunden gegen) mit einem kommen optimal zu planen. Für wirklich komplexe Abfragen, kann es nicht einmal garantiert ein optimal Plan, es muss nur Heuristiken verwenden, um mit einem ziemlich gut Plan. So indem sie sie zwingen, jedes Mal neu zu kompilieren, Sie sagen, dass es durch diesen Prozess gehen muss immer und immer wieder, auch wenn der Plan es vor bekamen, war vollkommen gut.
auf dem Kreditoren Je sollte es automatische Auslöser seines für Abfragepläne neu zu kompilieren - zum Beispiel, wenn die Statistiken auf einen Tisch wesentlich ändern (wie das Histogramm von Werten in einer bestimmten Spalte gleichmäßig durch verteilt beginnen im Laufe der Zeit stark verzerrt wird ), dann sollte die DB, dass bemerken und den Plan neu kompilieren. Aber allgemein gesprochen, die Implementierer einer Datenbank werden im Großen und Ganzen darüber schlauer sein als du bist.
Wie bei allem leistungsbezogen, nehmen Sie nicht Aufnahmen im Dunkeln; herauszufinden, wo die Engpässe sind, dass 90% der Leistung kosten, und lösen sie zuerst.
Andere Tipps
Um es auf jeder gespeicherten Prozedur ist keine gute Idee, da die Erstellung eines Abfrage-Plan eine relativ teure Operation ist, und Sie werden keinen Nutzen aus den Abfrage-Pläne sehen im Cache gespeichert werden und wiederverwendet werden.
Der Fall einer dynamischen Klausel, wo innerhalb einer gespeicherten Prozedur aufgebaut kann mit sp_executesql
behandelt werden, um die TSQL auszuführen anstatt WITH RECOMPILE
auf die gespeicherte Prozedur hinzugefügt wird.
Eine andere Lösung (SQL Server 2005 an) ist Hinweis mit spezifischen Parameter verwenden, um den OPTIMIZE FOR
Hinweis verwenden. Das funktioniert gut, wenn die Werte in den Reihen statisch sind.
SQL Server 2008 wird eingeführt, um ein wenig bekanntes Merkmal genannt "OPTIMIZE FOR UNKNOWN
":
Dieser Hinweis lenkt den Abfrageoptimierer die Standard-Algorithmen zu verwenden, es hat Wenn keine Parameter Werte immer verwendet hatte überhaupt die Abfrage übergeben. In diesem Fall wird das Optimierungsprogramm aussehen auf allen verfügbaren statistischen Daten erreichen eine Bestimmung dessen, was die Werte der lokalen Variablen verwendet erzeugen sollte der Auswertungsplan sein, statt an den spezifischen suchen Parameterwerte, die übergeben wurden die Abfrage von der Anwendung ab.
Die häufigste Verwendung ist, wenn Sie ein dynamische haben könnten WHERE-Klausel in einem Verfahren ... Sie würden nicht, dass bestimmte Abfrage-Plan wollen für nachfolgende Ausführungen zusammengestellt und gespeichert werden, weil es sehr gut nicht genau die gleiche Klausel sein könnte das nächste Mal, wenn die Prozedur aufgerufen wird.
im Allgemeinen eine viel bessere Alternative zu WITH RECOMPILE
ist OPTION(RECOMPILE)
wie Sie unten auf die Erklärung sehen können, von die Antwort auf diese Frage hier
Wenn ein Parameter-Empfindlichkeit Problem angetroffen wird, ein gemeinsames Stück Beratung in Foren und Q & A-Site ist auf „Verwendung recompile“ (vorausgesetzt, die weitere Tuning-Optionen präsentiert früher sind nicht geeignet). Unglücklicherweise, dass die Beratung wird oft falsch interpretiert bedeuten WITH RECOMPILE Hinzufügen Option auf die gespeicherte Prozedur.
WITH RECOMPILE Mit effektiv bringt uns auf SQL Server 2000 Verhalten, wobei die gesamte gespeicherte Prozedur auf jedem neu kompiliert wird Ausführung. Eine bessere Alternative, auf SQL Server 2005 und höher, ist zu Verwenden Sie die OPTION (RECOMPILE) Abfrage-Hinweis auf nur die Aussage, dass leidet unter dem Parameter-Sniffing Problem. Diese Abfrage-Hinweis Ergebnisse in einer Neuübersetzung der problematischen Aussage nur; Ausführungspläne für andere Anweisungen innerhalb der gespeicherten Prozedur werden zwischengespeichert und wiederverwendet wie normal.
Mit WITH RECOMPILE bedeutet auch, den kompilierten Plan für die gespeicherte Verfahren wird nicht zwischengespeichert. Als Ergebnis ist keine Leistungsinformationen in DMVs wie sys.dm_exec_query_stats gehalten. Mit Hilfe der Abfrage Hinweis stattdessen bedeutet, dass ein kompilierte Plan zwischengespeichert werden kann, und die Leistung Informationen sind in den DMVs verfügbar (obwohl es auf den meisten beschränkt ist jüngste Ausführung, für die betroffene Anweisung nur).
Für laufende Ausgaben mindestens SQL Server 2008 Build 2746 (Service Pack 1 mit Cumulative Update 5), mit der Option (RECOMPILE) einem weiteren erheblicher Vorteil gegenüber WITH RECOMPILE: nur OPTION (RECOMPILE) die Parameter Embedding-Optimierung ermöglicht.
Es sollte nur verwendet werden, wenn sie mit reprentative Daten und Kontext Prüfung zeigen, dass ohne produziert Pläne ungültige Abfrage zu tun (was auch immer die Gründe sein könnten). Sie nicht vorher übernehmen (ohne Prüfung), dass ein SP nicht richtig optimieren.
Einzige Ausnahme für nur manuelle Aufruf (das heißt Code nicht in das SP): Wenn Sie wissen, dass Sie im Wesentlichen den Charakter der Zieltabellen geändert haben. z.B. TRUNCATE, bulk Lasten usw.
Es ist noch eine weitere Möglichkeit für vorzeitige Optimierung.
Hinweis: Ich habe viele Punkte. Wenn ein newby unten die gleiche Antwort einreicht, und Sie stimmen zu, upvote ihnen.