Erzwungene Parametrisierung

Sie können das standardmäßige Parametrisierungsverhalten von SQL Server, die einfache Parametrisierung, außer Kraft setzen, indem Sie angeben, dass alle SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen in einer Datenbank mit bestimmten Einschränkungen parametrisiert werden sollen. Die erzwungene Parametrisierung wird durch Festlegen der PARAMETERIZATION-Option in der ALTER DATABASE-Anweisung auf FORCED aktiviert. Indem sie die Frequenz von Anweisungskompilierungen und -neukompilierungen verringert, kann die erzwungene Parametrisierung die Leistungsfähigkeit bestimmter Datenbanken erhöhen. Dabei handelt es sich im Allgemeinen um Datenbanken, die einer großen Anzahl gleichzeitiger Abfragen ausgesetzt sind, wie z. B. Point-of-Sale-Anwendungen.

Wenn die PARAMETERIZATION-Option auf FORCED festgelegt ist, werden während der Kompilierung der Abfrage alle Literalwerte in SELECT-, INSERT-, UPDATE- oder DELETE-Anweisungen, ungeachtet der Form, in der sie übergeben wurden, in Parameter konvertiert. Ausnahmen bilden Literalwerte in folgenden Abfragekonstruktionen:

  • INSERT...EXECUTE-Anweisungen.

  • Anweisungen innerhalb des Hauptteils von gespeicherten Prozeduren, Triggern oder benutzerdefinierten Funktionen. SQL Server setzt bereits die Wiederverwendung von Abfrageplänen für diese Routinen ein.

  • Vorbereitete Anweisungen, die bereits in der clientbasierten Anwendung parametrisiert wurden.

  • Anweisungen, die XQuery-Methodenaufrufe enthalten, wo die Methode in einem Kontext angezeigt wird, in dem ihre Argumente normalerweise parametrisiert werden, wie beispielsweise die WHERE-Klausel. Wenn die Methode in einem Kontext angezeigt wird, in dem ihre Argumente normalerweise nicht parametrisiert werden, wird der Rest der Anweisung parametrisiert.

  • Anweisungen innerhalb eines Transact-SQL-Cursors. (SELECT-Anweisungen innerhalb von API-Cursorn werden parametrisiert.)

  • Als veraltet markierte Abfragekonstrukte.

  • Alle Anweisungen, die im Kontext von auf OFF festgelegtem ANSI_PADDING oder ANSI_NULLS ausgeführt werden.

  • Anweisungen mit mehr als 2.097 parametrisierbaren Literalwerten.

  • Anweisungen, die auf Variablen verweisen, wie beispielsweise WHERE T.col2 >= @bb.

  • Anweisungen mit RECOMPILE-Abfragehinweis.

  • Anweisungen mit COMPUTE-Klauseln.

  • Anweisungen mit einer WHERE CURRENT OF-Klausel.

Außerdem werden die folgenden Abfrageklauseln nicht parametrisiert. Beachten Sie, dass in diesen Fällen nur die Klauseln nicht parametrisiert werden. Andere Klauseln in derselben Abfrage können für eine erzwungene Parametrisierung in Frage kommen.

  • <select_list> in SELECT-Anweisungen. Dies trifft ebenfalls auf SELECT-Listen von Unterabfragen sowie SELECT-Listen innerhalb von INSERT-Anweisungen zu.

  • Unterabfragen mit SELECT-Anweisungen innerhalb von IF-Anweisungen.

  • Die Abfrageklauseln TOP, TABLESAMPLE, HAVING, GROUP BY, ORDER BY, OUTPUT...INTO und FOR XML.

  • Direkte oder als Teilausdrücke formulierte Argumente der Operatoren OPENROWSET, OPENQUERY, OPENDATASOURCE, OPENXML sowie aller FULLTEXT-Operatoren.

  • Das pattern-Argument und das escape_character-Argument einer LIKE-Klausel.

  • Das style-Argument einer CONVERT-Klausel.

  • Integer-Konstanten innerhalb einer IDENTITY-Klausel.

  • Über die ODBC-Erweiterungssyntax angegebene Konstanten.

  • Vor der Kompilierzeit auf eine Konstante reduzierbar Ausdrücke, die Argumente der Operatoren +, -, *, / und % sind. Um zu ermitteln, ob die erzwungene Parametrisierung in Frage kommt, betrachtet SQL Server einen Ausdruck als vor der Kompilierzeit auf eine Konstante reduzierbar, wenn die beiden folgenden Bedingungen erfüllt sind:

    • Der Ausdruck enthält keine Spalten, Variablen oder Unterabfragen.

    • Der Ausdruck enthält eine CASE-Klausel.

    Weitere Informationen zu vor der Kompilierzeit auf eine Konstante reduzierbaren Ausdrücken finden Sie unter Problembehandlung bei unzureichender Abfrageleistung: Reduktion konstanter Ausdrücke und Ausdrucksauswertung während der Schätzung der Kardinalität.

  • Argumente von Abfragehinweisklauseln. Zu diesen gehören das number_of_rows-Argument des FAST-Abfragehinweises, das number_of_processors-Argument des MAXDOP-Abfragehinweises sowie das number-Argument des MAXRECURSION-Abfragehinweises.

Die Parametrisierung wird auf der Ebene der einzelnen Transact-SQL-Anweisungen ausgeführt, d. h. die Anweisungen werden nacheinander batchweise parametrisiert. Nach dem Kompilieren wird eine parametrisierte Abfrage ausgeführt – in dem Kontext des Batches, in dem die Abfrage ursprünglich übermittelt wurde. Wenn ein Ausführungsplan für eine Abfrage zwischengespeichert ist, können Sie anhand der sql-Spalte der dynamischen Verwaltungssicht sys.syscacheobjects ermitteln, ob die Abfrage parametrisiert wurde. Wenn eine Abfrage parametrisiert wird, stehen die Namen und Datentypen der Parameter vor dem Text des übergebenen Batches in dieser Spalte, wie beispielsweise (@1 tinyint). Informationen zum Zwischenspeichern von Abfrageplänen finden Sie unter Zwischenspeichern und Wiederverwenden von Ausführungsplänen.

HinweisHinweis

Parameternamen sind willkürlich. Benutzer bzw. Anwendungen sollten sich nicht auf eine bestimmte Namensreihenfolge verlassen. Darüber hinaus kann sich zwischen verschiedenen Versionen und Service Pack-Updates von SQL Server Folgendes ändern: Parameternamen, die Auswahl der parametrisierten Literale und der Abstand im parametrisierten Text.

Parameterdatentypen

Beim Parametrisieren von Literalwerten konvertiert SQL Server die Parameter in folgende Datentypen:

  • Integer-Literale, die von der Größe her in den int-Datentyp passen, werden beim Parametrisieren in int-Werte konvertiert. Größere Integer-Literale, die Teil von Prädikaten mit Vergleichsoperatoren sind (unter anderem <, <=, =, !=, >, >=, , !<, !>, <>, ALL, ANY, SOME, BETWEEN und IN) werden beim Parametrisieren in numeric(38,0)-Werte konvertiert. Größere Literale, die nicht Teil von Prädikaten mit Vergleichsoperatoren sind, werden bei der Parametrisierung in numeric-Werte mit ausreichenden Ziffern (precision) für ihre Größe und einem Dezimalstellenwert (scale) von 0 konvertiert.

  • Festkommaliterale, die Teil von Prädikaten mit Vergleichsoperatoren sind, werden bei der Parametrisierung in numeric-Werte mit 38 Ziffern (precision) und einem ausreichenden Dezimalstellenwert (scale) konvertiert. Festkommaliterale, die nicht Teil von Prädikaten mit Vergleichsoperatoren sind, werden bei der Parametrisierung in numeric-Werte mit ausreichenden Ziffern (precision) und einem ausreichenden Dezimalstellenwert (scale) konvertiert.

  • Fließkommaliterale werden bei der Parametrisierung in float(53)-Werte konvertiert.

  • Nicht-Unicode-Zeichenfolgenliterale werden bei der Parametrisierung in varchar(8000)-Werte konvertiert, wenn das Literal 8.000 Zeichen nicht überschreitet, und in varchar(max)-Werte, wenn es 8.000 Zeichen überschreitet.

  • Unicode-Zeichenfolgenliterale werden bei der Parametrisierung in nvarchar(4000)-Werte konvertiert, wenn das Literal 4.000 Unicode-Zeichen nicht überschreitet, und in nvarchar(max)-Werte, wenn es 4.000 Zeichen überschreitet.

  • Binärliterale werden bei der Parametrisierung in varbinary(8000)-Werte konvertiert, wenn das Literal 8.000 Byte nicht überschreitet. Wenn es 8.000 Byte überschreitet, wird es in einen varbinary(max)-Wert konvertiert.

  • Literale vom Typ money werden bei der Parametrisierung in money-Werte konvertiert.

Richtlinien für die Verwendung der erzwungenen Parametrisierung

Berücksichtigen Sie Folgendes, wenn Sie die PARAMETERIZATION-Option auf FORCED festlegen:

  • Die erzwungene Parametrisierung konvertiert die literalen Konstanten einer Abfrage, sobald diese kompiliert wird, tatsächlich in Parameter. Daher ist es möglich, dass der Abfrageoptimierer nicht die optimalen Abfragepläne auswählt. Insbesondere verringert sich die Wahrscheinlichkeit, dass der Abfrageoptimierer eine Übereinstimmung zwischen der Abfrage und der richtigen indizierten Sicht oder dem Index für eine berechnete Spalte findet. Außerdem wählt der Abfrageoptimierer möglicherweise auch für Abfragen für partitionierte Tabellen und verteilte partitionierte Sichten nicht optimale Abfragepläne aus. Die erzwungene Parametrisierung sollte deshalb nicht in Umgebungen verwendet werden, die sich stark auf indexierte Sichten oder Indizes für berechnete Spalten stützen. Im Allgemeinen sollte die PARAMETERIZATION FORCED-Option nur von erfahrenen Datenbankadministratoren verwendet werden, und auch dann nur, wenn diese sichergestellt haben, dass die erzwungene Parametrisierung die Leistung der Datenbank nicht beeinträchtigt.

  • Verteilte Abfragen, die auf mehrere Datenbanken verweisen, sind für die erzwungene Parametrisierung geeignet, solange die PARAMETERIZATION-Option in der Datenbank auf FORCED festgelegt wird, in deren Kontext die Abfrage ausgeführt wird.

  • Wenn die PARAMETERIZATION-Option auf FORCED festgelegt wird, werden alle Abfragepläne aus dem Plancache der Datenbank geleert, mit Ausnahme derer, die gerade kompiliert, erneut kompiliert oder ausgeführt werden. Die Pläne der Abfragen, die während der Einstellungsänderung kompiliert, erneut kompiliert oder ausgeführt werden, werden beim nächsten Ausführen der Abfrage parametrisiert.

  • Das Festlegen der PARAMETERIZATION-Option ist ein Onlinevorgang, d. h., es sind keine exklusiven Sperren auf Datenbankebene erforderlich.

  • Die erzwungene Parametrisierung ist deaktiviert (auf SIMPLE festgelegt), wenn die Kompatibilität einer SQL Server-Datenbank auf 80 festgelegt ist, oder eine aus einer früheren Instanz stammende Datenbank einer Instanz von SQL Server 2005 oder höher angefügt ist.

  • Die aktuelle Einstellung der PARAMETERIZATION-Option wird beim erneuten Anfügen oder Wiederherstellen beibehalten.

Sie können das Verhalten der erzwungenen Parametrisierung überschreiben, indem Sie angeben, dass für eine einzelne Abfrage und für alle anderen Abfragen, die syntaktisch äquivalent sind und sich nur in ihren Parameterwerten unterscheiden, die einfache Parametrisierung versucht werden soll. Im Gegensatz dazu können Sie angeben, dass die erzwungene Parametrisierung nur für einen Satz von syntaktisch äquivalenten Abfragen versucht werden soll, selbst wenn die erzwungene Parametrisierung in der Datenbank deaktiviert ist. Zu diesem Zweck werden Planhinweislisten verwendet. Weitere Informationen finden Sie unter Angeben des Abfrageparametrisierungsverhaltens mithilfe von Planhinweislisten.

HinweisHinweis

Wird die PARAMETERIZATION-Option auf FORCED festgelegt, werden Fehlermeldungen möglicherweise nicht auf die gleiche Weise wie bei der einfachen Parametrisierung gemeldet: eventuell werden mehr Fehlermeldungen als bei der einfachen Parametrisierung ausgegeben, und die Zeilennummern, in denen die Fehler aufgetreten sind, werden möglicherweise falsch gemeldet.