Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
När du anger databasalternativet PARAMETERIZATION till SIMPLEkan SQL Server frågeoptimeraren välja att parameterisera frågorna. Den här parameteriseringen ersätter eventuella literalvärden i en fråga med parametrar. Den här processen kallas enkel parameterisering. När SIMPLE parameteriseringen är i kraft 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 parametriseras genom att ange databasalternativet PARAMETERIZATION till FORCED. 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:
| Option | Description |
|---|---|
SIMPLE |
Du kan ange att tvingad parameterisering ska utföras på en viss typ av frågor. Det gör du genom att skapa en mallplansguide för frågans parametriserade form och ange frågetipset PARAMETERIZATION FORCED i den sp_create_plan_guide lagrade proceduren. 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 finns i Enkel parameterisering. |
FORCED |
Du kan ange att för en viss klass med frågor är det bara enkla parameteriseringsförsök, inte tvingad parameterisering. Det gör du genom att skapa en mallplansguide för frågans force-parameteriserade form och ange frågetipset PARAMETERIZATION SIMPLE i sp_create_plan_guide. Mer information finns i Tvingad parameterisering. |
Överväg följande fråga i AdventureWorks2025-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 bestämmer du 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:
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 att använda den systemlagrade proceduren sp_get_query_template.Skapa planguiden för frågans parametriserade form och ange frågetipset
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 för värdet av de konstanta literaler som skickas till utparametern
@stmtförsp_get_query_template. Eftersom datatypen som anges i@paramsargumentetsp_create_plan_guidemåste matcha frågans som 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 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)';
Om tvingad parameterisering redan är aktiverad i databasen kan du åsidosätta den för specifika frågor. Om du vill parametrisera exempelfrågan och syntaktiskt likvärdiga frågor enligt enkla parameteriseringsregler 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. Satser i batcher med flera satser kan inte matchas av planguider av typen TEMPLATE.