Parametreli sorgular için plan kılavuzları tasarlama
Bir plan kılavuzu, bir sorguyu parametrelenmiştir oluşturabilirsiniz.Aşağıdaki nedenlerden biriyle parametreli sorgu:
Sorgu kullanarak gönderilir Sp_executesql.
Zorlanmış parameterization veritabanında etkin durumda.Bu, uygun olan tüm sorgulara parameterizes.
Ayrı bir plan kılavuzu, parametresiz belirterek ait olduğu bu sorgu, sorgu bir sınıf üzerinde oluşturuldu.
Parametreli hale getirilmiş bir sorguya bir plan kılavuzu oluşturduğunuzda, aslında yalnızca sabit, hazır bilgi değerleri, aynı formun parameterize, ancak farklı olan tüm sorgular için bir plan kılavuzu oluşturuyorsunuz.Örneğin, Zorlanmış parameterization etkin olduğu bir veritabanında, aynı form için aşağıdaki iki sorgu parameterize:
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 parametreleştirilmiş sorguları oluşturmak için , Tür SQL bir plan kılavuz oluşturmak ve sorguda parametreli hale getirilmiş biçimi belirtmek sp_create_plan_guide saklı yordamını.
Örneğin, parametreleştirilmiş formun bir önceki örnekte sorgularını almak ve bir plan kılavuzu üzerinde karma birleştirmek kullanılacak en iyi duruma getiricisi zorlamak için oluşturmak için aşağıdaki adımları izleyin:
Parametreli Sorgu formu yürütmek yoluyla elde edilir. sp_get_query_template.
Sorgu zaten tarafından parametrelenmiştir değil, SQL Server kullanarak Sp_executesql veya PARAMETERIZATION ZORLANMıŞ veritabanı küme seçeneği, Tür TEMPLATE parameterization zorlamak için bir plan kılavuzu oluşturun.
SQL türü bir plan kılavuzu üzerinde parametreli hale getirilmiş bir sorguya oluşturun.
Aşağıdaki toplu iş iş işi bu adımların tüm üç 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 forma parameterize olan tüm sorgulara uygulanır, ancak farklı sabit hazır bilgi değerleri içerir.