Aracılığıyla paylaş


Parametre tabanlı sorguları planı kılavuzları tasarlama

Oluşturabileceğiniz bir plan kılavuzu üzerinde bir sorgu parametrelenmiştir.Aşağıdaki nedenlerden herhangi biri için bir sorgu parametreli:

  • Sorgu kullanarak gönderilen sp_executesql.

  • Zorla parameterizasyonunu veritabanında etkinleştirilir.Bu, tüm uygun sorguları parameterizes.

  • Parametreli belirterek ayrı plan Kılavuzu ait olduğu için bu sorgu, sorgular bir sınıf üzerinde oluşturuldu.

Bir plan kılavuzu üzerinde parametreli sorgu oluşturduğunuzda, yalnızca sabit hazır bilgi değerlerini, aynı forma stratejisinin ancak farklı tüm sorguları için bir plan kılavuz aslında oluşturuyorsunuz.Örneğin, aşağıdaki iki sorgu zorla parameterizasyonunu etkin olduğu bir veritabanında aynı forma stratejisinin:

SELECT pi.ProductID, SUM(pi.Quantity) AS Total 
FROM Production.ProductModel pm INNER JOIN Production.ProductInventory pi ON pm.ProductModelID = pi.ProductID 
WHERE pi.ProductID = 101 
GROUP BY pi.ProductID, pi.Quantity 
HAVING sum(pi.Quantity) > 50;

SELECT pi.ProductID, SUM(pi.Quantity) AS Total 
FROM Production.ProductModel pm INNER JOIN Production.ProductInventory pi ON pm.ProductModelID = pi.ProductID 
WHERE pi.ProductID = 101 
GROUP BY pi.ProductID, pi.Quantity 
HAVING sum(pi.Quantity) > 100;

Bir plan kılavuzu üzerinde parametreleştirilmiş sorguları oluşturmak için sql türü bir plan Kılavuzu oluşturun ve sorgunun parametreli formu belirtmek sp_create_plan_guide saklı yordam.

Örneğin, bir önceki örnekte sorguları parametreli formunu edinmek ve oluşturmak için bir plan kılavuzu üzerini karma birleştirmek kullanmak için en iyi duruma getiricisi zorlamak için şu adımları izleyin:

  1. Bir sorgu parametreli formu yürüterek elde sp_get_query_template.

  2. Sorgu zaten tarafından parametrelenmiştir değil, SQL Server kullanarak sp_executesql veya PARAMETERİZASYONUNU ZORLANAN AYARLI seçenek veritabanı, parameterizasyonunu zorlamak için şablon türü bir plan Kılavuzu oluşturun.

  3. Parametreleştirilmiş sorguyu sql türü bir plan Kılavuzu oluşturun.

Aşağıdaki toplu iş iş işi üçünü adımları yürütür:

--Obtain the paramaterized form of the query:
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 pm 
    INNER JOIN Production.ProductInventory 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;
--Force parameterization of the query. (This step is only required
--if the query is not already being parameterized.)
EXEC sp_create_plan_guide N'TemplateGuide1', 
    @stmt, 
N'TEMPLATE', 
NULL, 
@params, 
N'OPTION(PARAMETERIZATION FORCED)';
--Create a plan guide on the parameterized query
EXEC sp_create_plan_guide N'GeneralizedGuide1', 
@stmt, 
N'SQL', 
NULL, 
@params, 
N'OPTION(HASH JOIN)';

Plan Kılavuzu şimdi belirtilen form stratejisinin tüm sorgulara uygulanır, ancak farklı sabit hazır bilgi değerleri içerir.