Geben Sie das Parameterisierungsverhalten von Abfragen mithilfe von Planhinweisen an

Gilt für:SQL ServerAzure SQL-DatenbankAzure 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:

  1. Rufen Sie die parametrisierte Form der Abfrage ab. Die einzige sichere Methode, diesen Wert zur Verwendung in sp_create_plan_guide abzurufen, besteht in der Verwendung der gespeicherten Systemprozedur sp_get_query_template.

  2. Erstellen Sie die Plananleitung für die parametrisierte Form der Abfrage, und geben Sie den PARAMETERIZATION FORCED Abfragehinweis 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 @stmt von sp_get_query_template übergeben werden. Da der im @params Argument sp_create_plan_guide angegebene 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.