Entwerfen von Planhinweislisten für parametrisierte Abfragen
Sie können einen Planhinweis für eine Abfrage erstellen, die parametrisiert ist. Eine Abfrage kann aus einem der folgenden Gründe parametrisiert sein:
Die Abfrage wird mithilfe von sp_executesql übermittelt.
Erzwungene Parametrisierung ist in der Datenbank aktiviert. Dies bedeutet, dass alle geeigneten Abfragen parametrisiert werden.
Ein separater Planhinweis wurde für eine Klasse von Abfragen erstellt, zu denen diese Abfrage gehört; dabei wurde angegeben, dass sie parametrisiert sind.
Wenn Sie einen Planhinweis für eine parametrisierte Abfrage erstellen, erstellen Sie im Wesentlichen einen Planhinweis für alle Abfragen, die in die gleiche Form parametrisieren und sich nur hinsichtlich ihrer konstanten Literalwerte unterscheiden. In einer Datenbank, für die erzwungene Parametrisierung aktiviert ist, parametrisieren die folgenden beiden Abfragen z. B. in die gleiche Form:
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;
Um einen Planhinweis für parametrisierte Abfragen zu erstellen, erstellen Sie einen Planhinweis vom Typ SQL und geben dann die parametrisierte Form der Abfrage in der gespeicherten Prozedur sp_create_plan_guide an.
Wenn Sie z. B. die parametrisierte Form einer der Abfragen aus dem vorherigen Beispiel abrufen und einen Planhinweis für diese erstellen möchten, um den Optimierer zur Verwendung einer Hashverknüpfung zu zwingen, führen Sie die folgenden Schritte aus:
Rufen Sie die parametrisierte Form der Abfrage ab, indem Sie sp_get_query_template ausführen.
Wenn die Abfrage noch nicht von SQL Server mithilfe von sp_executesql oder der SET-Option PARAMETERIZATION FORCED der Datenbank parametrisiert wurde, erstellen Sie einen Planhinweis vom Typ TEMPLATE, um die Parametrisierung zu erzwingen.
Erstellen Sie einen Planhinweis vom Typ SQL für die parametrisierte Abfrage.
Der folgende Batch führt diese drei Schritte aus:
--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)';
Der Planhinweis gilt nun für alle Abfragen, die in die angegebene Form parametrisiert werden, jedoch unterschiedliche konstante Literalwerte enthalten.
Siehe auch