Funktionsweise der Übereinstimmung von Planhinweislisten und Abfragen (SQL Server)
SQL Server ermittelt die Übereinstimmung zwischen Planhinweislisten vom Typ OBJECT und Abfragen, die sich innerhalb von gespeicherten Prozeduren, Triggern oder Funktionen bzw. Funktionsmodulen befinden, welche im @module_or_batch-Argument der gespeicherten Prozedur sp_create_plan_guide genannt ist. Wenn für das Modul eine Planhinweisliste vorhanden ist, wird die Übereinstimmung mit der angegebenen Abfrage festgestellt.
Bei Abfragen, die in Batches übermittelt werden, ermittelt SQL Server übereinstimmende Planhinweislisten, indem zunächst nach einer SQL-basierten Planhinweisliste gesucht wird, anschließend versucht wird, die Abfrage zu parametrisieren, und schließlich der Parametrisierungsvorgang wiederholt wird. Die folgende Abbildung bietet einen Überblick über diesen Prozess.
Der SQL Server-Abfrageoptimierer erkennt einen ausgeführten Batch als Anforderung, jede Anweisung innerhalb des Batches zu kompilieren.
SQL Server versucht, für jede Anweisung innerhalb des Batches eine übereinstimmende, SQL-basierte Planhinweisliste zu ermitteln, d. h. eine Planhinweisliste, deren @module_or_batch-Argument mit dem des eingehenden Batchtexts übereinstimmt (einschließlich eventuell vorhandener Literalwerte) und deren @stmt-Argument ebenfalls mit der Anweisung des Batches übereinstimmt. Ist eine solche Planhinweisliste vorhanden und übereinstimmend, wird der Text der Anweisung dahin gehend geändert, dass er die in der Planhinweisliste angegebenen Abfragehinweise enthält, und die Anweisung wird entsprechend kompiliert.
Wenn keine Planhinweisliste mit der in Schritt 2 angeführten Anweisung übereinstimmt, versucht SQL Server, die Anweisung mithilfe der erzwungenen Parametrisierung zu parametrisieren. Bei diesem Schritt kann bei der Parametrisierung aus einem der folgenden Gründe ein Fehler auftreten:
Die Anweisung ist bereits parametrisiert oder enthält lokale Variablen.
Die SET-Datenbankoption PARAMETERIZATION SIMPLE wird angewendet (die Standardeinstellung), und es ist keine Planhinweisliste vom Typ TEMPLATE vorhanden, die für die Anweisung gilt und den Abfragehinweis PARAMETERIZATION FORCED angibt.
Es ist eine Planhinweisliste vom Typ TEMPLATE vorhanden, die für die Anweisung gilt und den Abfragehinweis PARAMETERIZATION SIMPLE angibt.
Wenn die erzwungene Parametrisierung erfolgreich ausgeführt werden konnte, versucht SQL Server, eine Übereinstimmung zwischen der parametrisierten Form der Anweisung und einer Planhinweisliste vom Typ SQL zu finden, die auf der Grundlage dieser parametrisierten Anweisung erstellt wurde. Ist eine solche Planhinweisliste vorhanden und übereinstimmend, wird der Text der Anweisung dahin gehend geändert, dass er die in der Planhinweisliste angegebenen Abfragehinweise enthält, und die Anweisung wird entsprechend kompiliert. Wenn keine Planhinweisliste übereinstimmt, wird die parametrisierte Anweisung unverändert kompiliert.
Wenn bei der Parametrisierung in Schritt 3 ein Fehler auftritt, versucht SQL Server erneut, die Anweisung zu parametrisieren. Bei diesem Schritt wendet SQL Server jetzt das standardmäßige einfache Parametrisierungsverhalten an. Die resultierende Abfrage wird anschließend direkt kompiliert. Für Ergebnisse der einfachen Parametrisierung werden keine Übereinstimmungen mit Planhinweislisten ermittelt.
Hinweis Der RECOMPILE-Abfragehinweis wird in Planhinweislisten vom Typ SQL ignoriert, die für die mithilfe der erzwungenen oder einfachen Parametrisierung parametrisierten Abfragen gelten. Außerdem wird eine Warnung ausgegeben.
Siehe auch