Gedrag voor queryparameterisatie opgeven met behulp van planhandleidingen

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Wanneer u de PARAMETERIZATION databaseoptie SIMPLEinstelt, kan de SQL Server queryoptimalisatie ervoor kiezen om de query's te parameteriseren. Deze parameterisatie vervangt letterlijke waarden in een query door parameters. Dit proces wordt eenvoudige parameterisatie genoemd. Wanneer SIMPLE parameterisatie van kracht is, kunt u niet bepalen welke query's worden geparameteriseerd en welke query's dat niet zijn. U kunt echter opgeven dat alle query's in een database worden geparameteriseerd door de PARAMETERIZATION databaseoptie in te stellen op FORCED. Dit proces wordt geforceerde parameterisatie genoemd.

U kunt het gedrag van parameters van een database op de volgende manieren overschrijven met behulp van planhandleidingen:

Option Description
SIMPLE U kunt opgeven dat geforceerde parameterisatie wordt uitgevoerd op een bepaalde klasse query's. U doet dit door een sjabloonplangids te maken voor de geparameteriseerde vorm van de query en de PARAMETERIZATION FORCED queryhint op te geven in de sp_create_plan_guide opgeslagen procedure. U kunt dit soort planningsgids beschouwen als een manier om geforceerde parameters alleen in te schakelen voor een bepaalde klasse query's, in plaats van alle query's. Zie Simple parameterization voor meer informatie.
FORCED U kunt opgeven dat voor een bepaalde klasse van query's alleen eenvoudige parameterisatie wordt geprobeerd, niet geforceerde parameters. Dit doet u door een TEMPLATE-planhandleiding te maken voor de force-geparameteriseerde vorm van de query en de PARAMETERIZATION SIMPLE query-hint op te geven in sp_create_plan_guide. Zie Geforceerde parameterisatie voor meer informatie.

Houd rekening met de volgende query op de AdventureWorks2025-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 databasebeheerder bepaalt u dat u geen geforceerde parameterisatie wilt inschakelen voor alle query's in de database. U wilt echter compilatiekosten voorkomen voor alle query's die syntactisch gelijk zijn aan de vorige query, maar alleen verschillen in de letterlijke constante waarden. Met andere woorden, u wilt dat de query wordt geparameteriseerd, zodat een queryplan voor dit type query opnieuw wordt gebruikt. Voer in dit geval de volgende stappen uit:

  1. Haal de geparameteriseerde vorm van de query op. De enige veilige manier om deze waarde te verkrijgen voor gebruik in sp_create_plan_guide is met behulp van de sp_get_query_template systeem opgeslagen procedure.

  2. Maak de planhandleiding over de geparameteriseerde vorm van de query, waarbij u de PARAMETERIZATION FORCED queryhint opgeeft.

    Belangrijk

    Als onderdeel van het parameteriseren van een query wijst SQL Server een gegevenstype toe aan de parameters die de letterlijke waarden vervangen, afhankelijk van de waarde en grootte van de letterlijke waarde. Hetzelfde proces treedt op voor de waarde van de constante letterlijke waarden die worden doorgegeven aan de @stmt uitvoerparameter van sp_get_query_template. Omdat het gegevenstype dat is opgegeven in het @params argument van sp_create_plan_guide de query moet overeenkomen met het gegevenstype dat door SQL Server wordt geparameteriseerd, moet u mogelijk meer dan één planhandleiding maken om het volledige bereik van mogelijke parameterwaarden voor de query te behandelen.

Het volgende script kan worden gebruikt om de geparameteriseerde query te verkrijgen en er vervolgens een planhandleiding voor te maken:

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)';

Als geforceerde parameterisatie al is ingeschakeld voor de database, kunt u deze overschrijven voor specifieke query's. Als u de voorbeeldquery en syntactisch equivalente query’s volgens de regels voor eenvoudige parameterisering wilt parameteriseren, gebruikt u PARAMETERIZATION SIMPLE in plaats van PARAMETERIZATION FORCED in de clausule OPTION.

Notitie

Een sjabloonplan helpt bij het matchen van statements met query's die in batches worden ingediend, welke uitsluitend uit één enkele instructie bestaan. Instructies binnen batches met meerdere instructies kunnen niet worden gekoppeld aan TEMPLATE-plangidsen.