Einfache Parametrisierung
In SQL Server wird durch das Verwenden von Parametern oder Parametermarkierungen in Transact-SQL-Anweisungen die Wahrscheinlichkeit erhöht, dass das relationale Modul neue SQL-Anweisungen vorhandenen, zuvor kompilierten Ausführungsplänen zuordnet.
Sicherheitshinweis |
---|
Das Verwenden von Parametern oder Parametermarkierungen, die die vom Endbenutzer eingegebenen Werte enthalten, ist sicherer als das Verketten der Werte in einer Zeichenfolge, die dann mithilfe einer API-Datenzugriffsmethode, der EXECUTE-Anweisung oder der gespeicherten Prozedur sp_executesql ausgeführt werden. |
Wenn eine SQL-Anweisung ohne Parameter ausgeführt wird, parametrisiert SQL Server die Anweisung intern, um die Wahrscheinlichkeit zu erhöhen, dass ein übereinstimmender Ausführungsplan gefunden wird. Dieser Prozess wird als einfache Parametrisierung bezeichnet. In SQL Server 2000 wurde dieser Prozess als Auto-Parametrisierung bezeichnet.
Angenommen, die folgende Anweisung wird ausgeführt:
SELECT * FROM AdventureWorks2008R2.Production.Product
WHERE ProductSubcategoryID = 1;
Der Wert 1 am Ende der Anweisung kann als Parameter angegeben werden. Das relationale Modul erstellt den Ausführungsplan für diesen Batch so, als ob anstelle des Werts 1 ein Parameter angegeben worden wäre. Aufgrund dieser einfachen Parametrisierung erkennt SQL Server, dass die folgenden beiden Anweisungen im Prinzip den gleichen Ausführungsplan generieren, und verwendet den ersten Plan auch für die zweite Anweisung:
SELECT * FROM AdventureWorks2008R2.Production.Product
WHERE ProductSubcategoryID = 1;
SELECT * FROM AdventureWorks2008R2.Production.Product
WHERE ProductSubcategoryID = 4;
Bei der Verarbeitung komplexer SQL-Anweisungen können für das relationale Modul eventuell Schwierigkeiten bei der Bestimmung der Ausdrücke auftreten, die parametrisiert werden können. Um die Wahrscheinlichkeit zu erhöhen, dass das relationale Modul Übereinstimmungen zwischen komplexen SQL-Anweisungen und vorhandenen, nicht verwendeten Ausführungsplänen erkennt, sollten Sie die Parameter explizit mithilfe von sp_executesql oder Parametermarkierungen angeben. Weitere Informationen finden Sie unter Parameter und Wiederverwendung von Ausführungsplänen.
Hinweis |
---|
Wenn die arithmetischen Operatoren +, -, *, / oder % zur impliziten oder expliziten Konvertierung von Konstantenwerten der Datentypen int, smallint, tinyint oder bigint in die Datentypen float, real, decimal oder numeric verwendet werden, wendet SQL Server spezielle Regeln an, um den Typ und die Genauigkeit der Ausdrucksergebnisse zu berechnen. Allerdings unterscheiden sich diese Regeln in Abhängigkeit davon, ob die Abfrage parametrisiert ist oder nicht. Daher können gleiche Ausdrücke in Abfragen in einigen Fällen zu unterschiedlichen Ergebnissen führen. Weitere Informationen finden Sie unter int, bigint, smallint und tinyint (Transact-SQL). |
Beim Standardverhalten der einfachen Parametrisierung parametrisiert SQL Server eine relativ kleine Klasse von Abfragen. Allerdings können Sie angeben, dass mit bestimmten Einschränkungen alle Abfragen in einer Datenbank parametrisiert werden, indem Sie die PARAMETERIZATION-Option des Befehls ALTER DATABASE auf FORCED setzen. Damit kann die Leistung von Datenbanken verbessert werden, bei denen sehr viele gleichzeitige Abfragen auftreten, indem die Häufigkeit der Abfragekompilierungen verringert wird. Weitere Informationen finden Sie unter Erzwungene Parametrisierung.
Alternativ können Sie angeben, dass eine einzelne Abfrage und alle anderen Abfragen, die in ihrer Syntax gleichwertig sind, und lediglich in ihren Parameterwerten abweichen, parametrisiert werden. Weitere Informationen finden Sie unter Angeben des Abfrageparametrisierungsverhaltens mithilfe von Planhinweislisten.