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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top