Angeben des Abfrageparametrisierungsverhaltens mithilfe von PlanhinweislistenSpecify Query Parameterization Behavior by Using Plan Guides

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Wenn die PARAMETERIZATION-Datenbankoption auf SIMPLE festgelegt ist, kann der SQL ServerSQL Server -Abfrageoptimierer die Abfragen ggf. parametrisieren.When the PARAMETERIZATION database option is set to SIMPLE, the SQL ServerSQL Server query optimizer may choose to parameterize the queries. Dies bedeutet, dass alle eventuell in einer Abfrage enthaltenen Literalwerte durch Parameter ersetzt werden.This means that any literal values that are contained in a query are substituted with parameters. Dieses Verfahren wird als einfache Parametrisierung bezeichnet.This process is referred to as simple parameterization. Wenn die einfache Parametrisierung aktiviert ist, können Sie nicht steuern, welche Abfragen parametrisiert werden sollen und welche nicht.When SIMPLE parameterization is in effect, you cannot control which queries are parameterized and which queries are not. Sie können jedoch angeben, dass alle Abfragen einer Datenbank parametrisiert werden sollen, indem Sie die PARAMETERIZATION-Datenbankoption auf FORCED festlegen.However, you can specify that all queries in a database be parameterized by setting the PARAMETERIZATION database option to FORCED. Dieses Verfahren wird als erzwungene Parametrisierung bezeichnet.This process is referred to as forced parameterization.

Sie können das Parametrisierungsverhalten einer Datenbank überschreiben, in dem Sie Planhinweislisten verwenden. Es gibt dabei folgende Möglichkeiten:You can override the parameterization behavior of a database by using plan guides in the following ways:

  • Wenn die PARAMETERIZATION-Datenbankoption auf SIMPLE festgelegt ist, können Sie angeben, dass für eine bestimmte Abfrageklasse die erzwungene Parametrisierung versucht werden soll.When the PARAMETERIZATION database option is set to SIMPLE, you can specify that forced parameterization is attempted on a certain class of queries. Erstellen Sie dazu eine TEMPLATE-Planhinweisliste für die parametrisierte Form der Abfrage, und geben Sie den PARAMETERIZATION FORCED-Abfragehinweis in der gespeicherten Prozedur sp_create_plan_guide an.You do this by creating a TEMPLATE plan guide on the parameterized form of the query, and specifying the PARAMETERIZATION FORCED query hint in the sp_create_plan_guide stored procedure. Betrachten Sie diese Art, Planhinweislisten zu verwenden, als Verfahren, die erzwungene Parametrisierung nur für eine bestimmte, jedoch nicht alle Abfrageklassen zu aktivieren.You can consider this kind of plan guide as a way to enable forced parameterization only on a certain class of queries, instead of all queries. Weitere Informationen zur einfachen Parametrisierung finden Sie im Handbuch zur Architektur der Abfrageverarbeitung.For more information on simple parameterization, see the Query Processing Architecture Guide.

  • Wenn die PARAMETERIZATION-Datenbankoption auf FORCED festgelegt ist, können Sie angeben, dass für eine bestimmte Abfrageklasse nur die einfache Parametrisierung versucht werden soll, jedoch nicht die erzwungene Parametrisierung.When the PARAMETERIZATION database option is set to FORCED, you can specify that for a certain class of queries, only simple parameterization is attempted, not forced parameterization. Erstellen Sie dazu eine TEMPLATE-Planhinweisliste für die erzwungene parametrisierte Form der Abfrage, und geben Sie in sp_create_plan_guide den PARAMETERIZATION SIMPLE-Abfragehinweis an.You do this by creating a TEMPLATE plan guide on the force-parameterized form of the query, and specifying the PARAMETERIZATION SIMPLE query hint in sp_create_plan_guide. Weitere Informationen zur erzwungenen Parametrisierung finden Sie im Handbuch zur Architektur der Abfrageverarbeitung.For more information on forced parameterization, see the Query Processing Architecture Guide.

Betrachten Sie die folgende Abfrage in der AdventureWorks2012AdventureWorks2012 -Datenbank:Consider the following query on the AdventureWorks2012AdventureWorks2012 database:

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 haben Sie bestimmt, dass Sie die erzwungene Parametrisierung nicht für alle Abfragen der Datenbank aktivieren möchten.As a database administrator, you have determined that you do not want to enable forced parameterization on all queries in the database. Sie sind jedoch darauf bedacht, den Aufwand zu vermeiden, alle Abfragen neu zu kompilieren, obwohl sie syntaktisch mit vorherigen Abfragen gleichwertig sind und sich lediglich durch ihre konstanten Literalwerte unterscheiden.However, you do want to avoid compilation costs on all queries that are syntactically equivalent to the previous query, but differ only in their constant literal values. Mit anderen Worten möchten Sie solche Abfragen parametrisieren, sodass für diese Art von Abfragen ein Abfrageplan wiederverwendet wird.In other words, you want the query to be parameterized so that a query plan for this kind of query is reused. Führen Sie in diesem Fall die folgenden Schritte aus:In this case, complete the following steps:

  1. Rufen Sie die parametrisierte Form der Abfrage ab.Retrieve the parameterized form of the query. Die einzig sichere Möglichkeit, diesen Wert zum Verwenden in sp_create_plan_guide abzurufen, besteht in der Verwendung der gespeicherten Systemprozedur sp_get_query_template .The only safe way to obtain this value for use in sp_create_plan_guide is by using the sp_get_query_template system stored procedure.

  2. Erstellen Sie die Planhinweisliste für die parametrisierte Form der Abfrage, indem Sie den PARAMETERIZATION FORCED-Abfragehinweis angeben.Create the plan guide on the parameterized form of the query, specifying the PARAMETERIZATION FORCED query hint.

    Wichtig

    Im Rahmen der Parametrisierung einer Abfrage weist SQL ServerSQL Server den Parametern, die die Literalwerte ersetzen, abhängig von Wert und Größe der Literalwerte, einen Datentyp zu.As part of parameterizing a query, SQL ServerSQL Server assigns a data type to the parameters that replace the literal values, depending on the value and size of the literal. Dasselbe Verfahren wird auf den Wert der an den @stmt-Ausgabeparameter von sp_get_query_template übergebenen konstanten Literale angewendet.The same process occurs to the value of the constant literals passed to the @stmt output parameter of sp_get_query_template. Da der im @params-Argument von sp_create_plan_guide angegebene Datentyp mit dem der von SQL ServerSQL Server parametrisierten Abfrage übereinstimmen muss, müssen Sie möglicherweise mehrere Planhinweislisten erstellen, um die gesamte Palette der möglichen Parameterwerte abzudecken.Because the data type specified in the @params argument of sp_create_plan_guide must match that of the query as it is parameterized by SQL ServerSQL Server, you may have to create more than one plan guide to cover the complete range of possible parameter values for the query.

Verwenden Sie das folgende Skript, um die parametrisierte Abfrage und anschließend eine Planhinweisliste dafür zu erstellen:The following script can be used both to obtain the parameterized query and then create a plan guide on it:

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC 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;  
EXEC sp_create_plan_guide   
    N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

Auf ähnliche Weise können Sie in einer Datenbank mit bereits aktivierter erzwungener Parametrisierung sicherstellen, dass die Beispielabfrage und andere, mit Ausnahme ihrer konstanten Literalwerte, syntaktisch gleichwertige Abfragen gemäß den Regeln für die einfache Parametrisierung parametrisiert werden.Similarly, in a database in which forced parameterization is already enabled, you can make sure that the sample query, and others that are syntactically equivalent, except for their constant literal values, are parameterized according to the rules of simple parameterization. Geben Sie dazu in der OPTION-Klausel PARAMETERIZATION SIMPLE anstelle von PARAMETERIZATION FORCED an.To do this, specify PARAMETERIZATION SIMPLE instead of PARAMETERIZATION FORCED in the OPTION clause.

Hinweis

Durch TEMPLATE-Planhinweislisten wird eine Übereinstimmung zwischen Anweisungen und batchweise übermittelten Abfragen hergestellt, die nur aus einer einzigen Anweisung bestehen.TEMPLATE plan guides match statements to queries submitted in batches that consist of a single statement only. Für Anweisungen innerhalb von Batches mit mehreren Anweisungen können TEMPLATE-Planhinweislisten keine Übereinstimmungen herstellen.Statements inside multistatement batches are not eligible to be matched by TEMPLATE plan guides.