Určení způsobu parametrizace dotazů pomocí průvodců plánem

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Když nastavíte PARAMETERIZATION možnost databáze na SIMPLE, SQL Server optimalizátor dotazů se může rozhodnout parametrizovat dotazy. Tato parametrizace nahrazuje všechny literální hodnoty v dotazu parametry. Tento proces se označuje jako jednoduchá parametrizace. Pokud SIMPLE je parametrizace platná, nemůžete řídit, které dotazy jsou parametrizovány a které dotazy nejsou. Můžete však určit, že všechny dotazy v databázi budou parametrizovány nastavením PARAMETERIZATION možnosti databáze na FORCEDhodnotu . Tento proces se označuje jako vynucené parametrizace.

Chování parametrizace databáze můžete přepsat pomocí příruček plánu následujícími způsoby:

Option Description
SIMPLE Můžete určit, že se má u určité třídy dotazů použít vynucená parametrizace. To provedete tak, že vytvoříte průvodce plánem typu TEMPLATE pro parametrizovanou formu dotazu a v uložené proceduře sp_create_plan_guide zadáte hint dotazu PARAMETERIZATION FORCED. Tento druh průvodce plánem můžete považovat za způsob, jak povolit vynucené parametrizace pouze u určité třídy dotazů místo všech dotazů. Další informace naleznete v tématu Jednoduchá parametrizace.
FORCED Můžete určit, že pro určitou třídu dotazů se pokusí provést pouze jednoduchá parametrizace, nikoli vynucená parametrizace. To provedete vytvořením průvodce plánem typu TEMPLATE pro vynuceně parametrizovaný tvar dotazu a zadáním rady dotazu PARAMETERIZATION SIMPLE v sp_create_plan_guide. Další informace naleznete v tématu Vynucené parametrizace.

Zvažte následující dotaz na databázi AdventureWorks2025:

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;

Jako správce databáze zjistíte, že nechcete povolit vynucené parametrizace u všech dotazů v databázi. Chcete se však vyhnout nákladům na kompilaci u všech dotazů, které jsou syntakticky ekvivalentní předchozímu dotazu, ale liší se pouze v jejich konstantních literálových hodnotách. Jinými slovy, chcete, aby byl dotaz parametrizován tak, aby byl znovu použit plán dotazu pro tento druh dotazu. V tomto případě proveďte následující kroky:

  1. Načtěte parametrizovanou formu dotazu. Jediným bezpečným způsobem, jak tuto hodnotu získat pro použití v sp_create_plan_guide, je použití systémové uložené procedury sp_get_query_template.

  2. Vytvořte průvodce plánem v parametrizované podobě dotazu a zadejte nápovědu PARAMETERIZATION FORCED k dotazu.

    Důležitý

    Jako součást parametrizace dotazu sql Server přiřadí datový typ parametrům, které nahradí hodnoty literálu v závislosti na hodnotě a velikosti literálu. Stejný proces se vyskytuje u hodnoty konstantních literálů předaných výstupnímu parametru @stmtsp_get_query_template. Vzhledem k tomu, že datový typ zadaný v argumentu @paramssp_create_plan_guide musí odpovídat hledanému dotazu, protože je parametrizován SQL Server, budete možná muset vytvořit více než jednoho průvodce plánem, který bude zahrnovat úplný rozsah možných hodnot parametrů dotazu.

K získání parametrizovaného dotazu a následnému vytvoření průvodce plánem můžete použít následující skript:

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

Pokud je v databázi už povolená vynucená parametrizace, můžete ji přepsat pro konkrétní dotazy. Pokud chcete parametrizovat ukázkový dotaz a syntakticky ekvivalentní dotazy podle jednoduchých pravidel parametrizace, zadejte PARAMETERIZATION SIMPLE místo PARAMETERIZATION FORCEDOPTION klauzule.

Poznámka

Průvodci šablonovým plánem přiřazují příkazy k dotazům odeslaným v dávkách, které se skládají pouze z jednoho příkazu. Příkazy uvnitř dávek obsahujících více příkazů nelze přiřadit k vodítkům plánů TEMPLATE.