Udostępnij za pośrednictwem


Utwórz przewodnik po planie dla zapytań sparametryzowanych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Poradnik dotyczący planu szablonowego pasuje do autonomicznych zapytań, które są parametryzowane do określonego formatu.

Poniższy przykład tworzy przewodnik planowania, który pasuje do dowolnego zapytania sparametryzowanego w określonej formie, i nakazuje programowi SQL Server wymuszenie parametryzacji zapytania. Następujące dwa zapytania są składniowo równoważne, ale różnią się tylko stałymi wartościami literału.

SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45639;  
  
SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45640;  

Oto przewodnik planu dotyczący sparametryzowanej formy zapytania:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
                  ON h.SalesOrderID = d.SalesOrderID  
              WHERE h.SalesOrderID = @0',  
    @type = N'TEMPLATE',  
    @module_or_batch = NULL,  
    @params = N'@0 int',  
    @hints = N'OPTION(PARAMETERIZATION FORCED)';  

W poprzednim przykładzie wartość parametru @stmt jest sparametryzowaną formą zapytania. Jedynym niezawodnym sposobem uzyskania tej wartości do użycia w sp_create_plan_guide jest użycie procedury składowanej systemu sp_get_query_template. Poniższy skrypt może służyć zarówno do uzyskania sparametryzowanego zapytania, jak i utworzenia przewodnika dotyczącego planu.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
          ON h.SalesOrderID = d.SalesOrderID  
      WHERE h.SalesOrderID = 45639;',  
    @stmt OUTPUT,   
    @params OUTPUT  
EXEC sp_create_plan_guide N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

Ważny

Wartość literałów stałych w parametrze @stmt przekazanym do sp_get_query_template może mieć wpływ na typ danych wybrany dla parametru zastępującego literał. Będzie to miało wpływ na dopasowanie instrukcji planu. Może być konieczne utworzenie więcej niż jednego przewodnika po planie w celu obsługi różnych zakresów wartości parametrów.

Przewodniki planu szablonu można również używać razem z przewodnikami planu SQL. Możesz na przykład utworzyć przewodnik po planie szablonu, aby upewnić się, że klasa zapytań jest sparametryzowana. Następnie możesz utworzyć przewodnik planu SQL dla sparametryzowanej formy tego zapytania.