Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Wenn Sie die PARAMETERIZATION Datenbankoption auf "SIMPLE" festlegen, kann der SQL Server Abfrageoptimierer die Abfragen parametrisieren. Diese Parameterisierung ersetzt alle Literalwerte in einer Abfrage durch Parameter. Dieses Verfahren wird als einfache Parametrisierung bezeichnet. Wenn SIMPLE die Parametrisierung wirksam ist, können Sie nicht steuern, welche Abfragen parametrisiert werden und welche Abfragen nicht. Sie können jedoch angeben, dass alle Abfragen in einer Datenbank parametrisiert werden, indem Sie die PARAMETERIZATION Datenbankoption auf festlegen FORCED. Dieses Verfahren wird als erzwungene Parametrisierung bezeichnet.
Sie können das Parametrisierungsverhalten einer Datenbank mithilfe von Planhinweisen auf folgende Weise außer Kraft setzen:
| Auswahl | Description |
|---|---|
SIMPLE |
Sie können angeben, dass die erzwungene Parameterisierung für eine bestimmte Klasse von Abfragen versucht wird. Dazu erstellen Sie eine TEMPLATE-Plananleitung für die parametrisierte Form der Abfrage und geben den PARAMETERIZATION FORCED Abfragehinweis in der sp_create_plan_guide gespeicherten Prozedur an. Sie können diese Art von Planhinweis als Möglichkeit betrachten, die erzwungene Parametrisierung nur für eine bestimmte Klasse von Abfragen statt für alle Abfragen zu aktivieren. Weitere Informationen finden Sie unter "Einfache Parametrisierung". |
FORCED |
Sie können angeben, dass für eine bestimmte Klasse von Abfragen nur eine einfache Parametrisierung versucht wird, nicht die erzwungene Parametrisierung. Dazu erstellen Sie einen TEMPLATE-Planhinweis für die zwangsparametrisierte Form der Abfrage und geben den Abfragehinweis PARAMETERIZATION SIMPLE in sp_create_plan_guide an. Weitere Informationen finden Sie unter "Erzwungene Parametrisierung". |
Betrachten Sie die folgende Abfrage in der AdventureWorks2025 -Datenbank:
SELECT pi.ProductID,
SUM(pi.Quantity) AS Total
FROM Production.ProductModel AS pm
INNER JOIN Production.ProductInventory AS pi
ON pm.ProductModelID = pi.ProductID
WHERE pi.ProductID = 101
GROUP BY pi.ProductID, pi.Quantity
HAVING SUM(pi.Quantity) > 50;
Als Datenbankadministrator legen Sie fest, dass Sie die erzwungene Parametrisierung für alle Abfragen in der Datenbank nicht aktivieren möchten. Sie möchten jedoch Kompilierungskosten für alle Abfragen vermeiden, die syntaktisch der vorherigen Abfrage entsprechen, unterscheiden sich jedoch nur in ihren konstanten Literalwerten. Mit anderen Worten möchten Sie solche Abfragen parametrisieren, sodass für diese Art von Abfragen ein Abfrageplan wiederverwendet wird. Führen Sie in diesem Fall die folgenden Schritte aus:
Rufen Sie die parametrisierte Form der Abfrage ab. Die einzige sichere Methode, diesen Wert zur Verwendung in
sp_create_plan_guideabzurufen, besteht in der Verwendung der gespeicherten Systemprozedur sp_get_query_template.Erstellen Sie die Plananleitung für die parametrisierte Form der Abfrage, und geben Sie den
PARAMETERIZATION FORCEDAbfragehinweis an.Wichtig
Im Rahmen der Parametrisierung einer Abfrage weist SQL Server den Parametern, die die Literalwerte ersetzen, abhängig von Wert und Größe der Literalwerte, einen Datentyp zu. Derselbe Prozess findet auch auf die Werte der Konstantliterale Anwendung, die an den Ausgabeparameter
@stmtvonsp_get_query_templateübergeben werden. Da der im@paramsArgumentsp_create_plan_guideangegebene Datentyp mit dem der Abfrage übereinstimmen muss, da er von SQL Server parametrisiert wird, müssen Sie möglicherweise mehrere Planleitfaden erstellen, um den vollständigen Bereich möglicher Parameterwerte für die Abfrage abzudecken.
Das folgende Skript kann sowohl verwendet werden, um die parametrisierte Abfrage zu ermitteln, als auch anschließend einen Planhinweis dafür zu erstellen:
DECLARE @stmt AS NVARCHAR (MAX);
DECLARE @params AS NVARCHAR (MAX);
EXECUTE sp_get_query_template
N'SELECT pi.ProductID, SUM(pi.Quantity) AS Total
FROM Production.ProductModel AS pm
INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID
WHERE pi.ProductID = 101
GROUP BY pi.ProductID, pi.Quantity
HAVING SUM(pi.Quantity) > 50',
@stmt OUTPUT, @params OUTPUT;
EXECUTE sp_create_plan_guide N'TemplateGuide1',
@stmt, N'TEMPLATE', NULL,
@params, N'OPTION(PARAMETERIZATION FORCED)';
Wenn die erzwungene Parametrisierung bereits für die Datenbank aktiviert ist, können Sie sie für bestimmte Abfragen überschreiben. Um die Beispielabfrage und syntaktisch äquivalente Abfragen gemäß den Regeln der einfachen Parametrisierung zu parametrisieren, geben Sie in der OPTION-Klausel PARAMETERIZATION SIMPLE anstelle von PARAMETERIZATION FORCED an.
Hinweis
TEMPLATE-Planhinweise ordnen Anweisungen Abfragen zu, die in Batches übermittelt werden, die jeweils nur eine einzige Anweisung enthalten. Anweisungen innerhalb von Batches mit mehreren Anweisungen können nicht mit TEMPLATE-Planhinweisen abgeglichen werden.