Dela via


Ange beteende för frågeparameterisering med hjälp av planguider

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

När parameteriseringsdatabasalternativet är inställt på SIMPLE kan SQL Server-frågeoptimeraren välja att parameterisera frågorna. Det innebär att alla literalvärden som finns i en fråga ersätts med parametrar. Den här processen kallas enkel parameterisering. När SIMPLE-parameterisering tillämpas kan du inte styra vilka frågor som parametriseras och vilka frågor som inte är det. Du kan dock ange att alla frågor i en databas ska parameteriseras genom att ställa in alternativet för parameterisering av databasen till 'FORCERAD'. Den här processen kallas för tvingad parameterisering.

Du kan åsidosätta parameteriseringsbeteendet för en databas med hjälp av planguider på följande sätt:

  • När parameteriseringsdatabasalternativet är inställt på SIMPLE kan du ange att tvingad parameterisering görs på en viss typ av frågor. Det gör du genom att skapa en TEMPLATE-plansguide för frågans parametriserade form, och genom att specificera frågetipset PARAMETERIZATION FORCED i den lagrade proceduren sp_create_plan_guide. Du kan betrakta den här typen av planguide som ett sätt att aktivera tvingad parameterisering endast på en viss typ av frågor, i stället för alla frågor. Mer information om enkel parameterisering finns i arkitekturguiden för frågebearbetning.

  • När parameteriseringsdatabasalternativet är inställt på FORCED kan du ange att för en viss typ av frågor görs endast enkla parameteriseringsförsök, inte tvingad parameterisering. Det gör du genom att skapa en mallplaneringsguide för frågans kraftparameteriserade form och ange PARAMETERIZATION SIMPLE-frågeindikatorn i sp_create_plan_guide. Mer information om tvingad parameterisering finns i arkitekturguiden för frågebearbetning.

Överväg följande fråga i AdventureWorks2022-databasen:

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;  

Som databasadministratör har du fastställt att du inte vill aktivera tvingad parameterisering för alla frågor i databasen. Du vill dock undvika kompileringskostnader för alla frågor som är syntaktiskt likvärdiga med den tidigare frågan, men som bara skiljer sig åt i sina konstanta literalvärden. Med andra ord vill du att frågan ska parametriseras så att en frågeplan för den här typen av fråga återanvänds. I det här fallet utför du följande steg:

  1. Hämta frågans parametriserade form. Det enda säkra sättet att hämta det här värdet för användning i sp_create_plan_guide är genom att använda den sp_get_query_template systemlagrade proceduren.

  2. Skapa planguiden i den parametriserade formen av frågan och ange frågeledtråden PARAMETERIZATION FORCED.

    Viktig

    Som en del av parameteriseringen av en fråga tilldelar SQL Server en datatyp till parametrarna som ersätter literalvärdena, beroende på värdet och storleken på literalen. Samma process sker med värdet för de konstanta literaler som skickas till @stmt-utdataparametern för sp_get_query_template. Eftersom den datatyp som anges i argumentet @params för sp_create_plan_guide måste matcha frågans eftersom den parametriseras av SQL Server, kan du behöva skapa mer än en planguide för att täcka hela intervallet med möjliga parametervärden för frågan.

Följande skript kan användas både för att hämta den parametriserade frågan och sedan skapa en planguide för den:

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

På samma sätt kan du i en databas där tvingad parameterisering redan är aktiverad se till att exempelfrågan och andra som är syntaktiskt likvärdiga, förutom deras konstanta literalvärden, parametriseras enligt reglerna för enkel parameterisering. För att göra detta anger du PARAMETERIZATION SIMPLE i stället för PARAMETERIZATION FORCED i OPTION-satsen.

Anteckning

Mallplanguider matchar frågor till frågor som skickas i batcher som enbart består av ett enda uttalande. Uttalanden i flersatsbatcher är inte möjliga att matcha med MALL-planguider.