Frage

Ich habe auf dem SQL Server 2008 OPTIMIZE FOR UNKNOWN Abfrage-Hinweis nachlesen. Ich verstehe, wie es funktioniert.

Aber ich habe eine Frage auf mit und , wenn , es zu benutzen. Es kann nicht in einem UDF angegeben werden. Es kann innerhalb einer gespeicherten proc angegeben werden. Allerdings diese MSDN Blog Post besagt Folgendes :

eine Abfrage in einer gespeicherten Prozedur 4.Moving kann es in einem separaten setzen Verfahrens Kontext und kann eine gute sein Art und Weise, diesen Wert sichtbar die zu bekommen Optimierer (Anmerkung: Dies funktioniert in SQL 2000 als auch)

Das scheint mich zu sagen, dass jeder Parameter auf eine gespeicherte Prozedur übergeben wird „schnuppert“ werden, wodurch SQL Server helfen, einen optimalen Ausführungsplan zu erstellen. Dies impliziert, dass der zwischengespeicherte Plan überprüft werden würde / neu kompiliert (nicht sicher, ob dieser Mechanismus). Dies ist jedoch verwirrend, weil es die ganze Notwendigkeit OPTIMIZE FOR UNKNOWN negiert.

Die MSDN-Artikel auf Abfragehinweisen meine Frage nicht decken.

Kann jemand Antwort für mich, im Idealfall mit einem Zeiger auf etwas von Microsoft, das aufräumt. Danke.

War es hilfreich?

Lösung

Das Standardverhalten des SQL-Compiler ist es, die Werte aller Parameter in der ersten Ausführung eines SP zu optimieren gegeben zu verwenden, der Plan (siehe Ziffern 2 und 3 der dieser MSDN-Artikel auf SP Neuübersetzung ). Dieser Plan wird dann zur erneuten Verwendung zwischengespeichert, bis sie die Cache-Blätter - viele Details auf dem Plan Caching-Prozess hier .

Die MSDN-Blog Sie zitieren ist Möglichkeiten, unter Hinweis darauf, diesen Prozess einfacher für die Compiler zu machen; Ich denke, Punkt 4 (in der Frage zitierte) ist darauf hindeutet, dass dies ein Vorteil von gespeicherten Prozeduren über Ad-hoc-SQL.

Der OPTIMIZE FOR UNKNOWN Hinweis weist den Compiler das Standardverhalten aviod; dass es sollte die Parameterwerte angegeben in der ersten Ausführung, und wählen Sie einen generali Plan ignorieren. Dies ist eine extreme Version von Punkt 2 in der Liste der Vorschläge am Ende der Blog-Post in der Frage zitiert;

2 Wenn Sie feststellen, dass das Optimierungsprogramm ist Kommissionierung verschiedene Pläne im Laufe der Zeit, dass haben unterschiedliche Leistung Eigenschaften, halten eine Verwendung hint Parameter mit einem repräsentativen „Durchschnittlichen“ Wert eine gute, gemeinsame bekommen Abfrageplan, vernünftig arbeiten für alle Werte.

, sondern als einen durchschnittlichen oder repräsentativen Wert ausgewählt hat, wird der Compiler effektiv die Parameterwerte vollständig ignorieren.

Betrachten OPTIMIZE FOR UNKNOWN Verwendung in den in Artikel gegebenen Umständen zitiert 2 - wenn die gleiche Abfrage sehr variable Leistung gibt, weil der Plan unter Umständen schlecht ist -. Typischerweise, wenn die Parameter in den Abfragefilterspalten sehr variabel Mächtigkeit

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