Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
Important
Mit Abfragespeicherhinweisen können Sie Abfragepläne auf einfache Weise strukturieren, ohne den Anwendungscode ändern zu müssen. Abfragespeicher-Hinweise sind einfacher als Planhinweise. Abfragespeicherhinweise sind in der Azure SQL-Datenbank, SQL-Datenbank in Microsoft Fabric, Azure SQL Managed Instance und in SQL Server 2022 (16.x) und späteren Versionen verfügbar.
Mit Planhinweislisten können Sie die Leistung von Abfragen optimieren, wenn Sie den Text der eigentlichen Abfrage in SQL Server nicht direkt ändern möchten oder können. Planleitfäden beeinflussen die Optimierung von Abfragen, indem sie einer Abfrage Abfragehinweise oder einen festen Abfrageplan zuordnen. Die Verwendung von Planhinweislisten bietet sich z. B. an, wenn eine kleine Teilmenge von Abfragen in der Datenbankanwendung eines Drittanbieters nicht erwartungsgemäß funktioniert. In der Planhinweisliste geben Sie die Transact-SQL-Anweisung an, die optimiert werden soll, sowie entweder eine OPTION-Klausel mit den zu verwendenden Abfragehinweisen oder einen spezifischen Abfrageplan, der für die Optimierung der Abfrage verwendet werden soll. Wenn die Abfrage ausgeführt wird, vergleicht SQL Server die Transact-SQL-Anweisung mit der Planhinweisliste und fügt der Abfrage entweder zur Laufzeit die OPTION-Klausel hinzu oder verwendet den angegebenen Abfrageplan. Da der SQL Server-Abfrageoptimierer in der Regel den besten Ausführungsplan für eine Abfrage auswählt, wird empfohlen, dass erfahrene Entwickler und Datenbankadministratoren Planhinweislisten nur verwenden, wenn alle anderen Möglichkeiten sich als unbefriedigend erwiesen haben.
Die Gesamtzahl der Planhinweise, die Sie erstellen können, ist nur durch die verfügbaren Systemressourcen begrenzt. Planhinweise sollten jedoch auf geschäftskritische Abfragen beschränkt bleiben, die gezielt auf eine Verbesserung oder Stabilisierung der Leistung ausgerichtet sind. Planhinweise sollten nicht verwendet werden, um den Großteil der Abfragelast einer bereitgestellten Anwendung zu beeinflussen.
Der durch dieses Feature erzwungene resultierende Ausführungsplan entspricht oder ähnelt dem Plan, der erzwungen wird. Da der resultierende Plan möglicherweise nicht mit dem von der Planhinweisliste angegebenen Plan identisch ist, kann die Leistung der Pläne variieren. In seltenen Fällen kann der Leistungsunterschied erheblich und negativ sein. In diesem Fall muss der Administrator den erzwungenen Plan entfernen.
Planhinweise können nicht in jeder Edition von Microsoft SQL Server verwendet werden. Eine Liste der Funktionen, die von den SQL Server-Editionen unterstützt werden, finden Sie unter Von den SQL Server 2016-Editionen unterstützte Funktionen. Planhilfen sind in jeder Version sichtbar. Sie können auch eine Datenbank, die Planhinweise enthält, mit jeder Edition anhängen. Planhinweise bleiben erhalten, wenn Sie eine Datenbank in einer aktualisierten Version von SQL Server wiederherstellen oder an diese anfügen.
Typen von Planhinweislisten
Die folgenden Arten von Planleitfäden können erstellt werden.
OBJECT-Planleitfaden
Ein OBJECT-Planhinweis gleicht Abfragen ab, die im Kontext von gespeicherten Transact-SQL-Prozeduren, benutzerdefinierten Skalarfunktionen, benutzerdefinierten Tabellenwertfunktionen mit mehreren Anweisungen und DML-Triggern ausgeführt werden.
Angenommen, die folgende gespeicherte Prozedur, die den @Country_region-Parameter annimmt, existiert in einer Datenbankanwendung, die in der AdventureWorks2025-Datenbank bereitgestellt wird:
CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country_region nvarchar(60))
AS
BEGIN
SELECT *
FROM Sales.SalesOrderHeader AS h, Sales.Customer AS c,
Sales.SalesTerritory AS t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = @Country_region
END;
Gehen Sie weiterhin davon aus, dass diese gespeicherte Prozedur kompiliert und für @Country_region = N'AU' (Australien) optimiert wurde. Aus Australien kommen jedoch nur relativ wenige Bestellungen. Wenn die Abfrage mit Parameterwerten für Länder oder Regionen mit mehr Bestellungen ausgeführt wird, verringert dies die Leistung. Da die meisten Bestellungen aus den USA kommen, würde ein für @Country_region = N'US' generierter Abfrageplan wahrscheinlich eine bessere Leistung für alle möglichen Werte des @Country_region -Parameters erbringen.
Sie könnten dieses Problem lösen, indem Sie die gespeicherte Prozedur so ändern, dass der Abfrage der OPTIMIZE FOR -Abfragehinweis hinzugefügt wird. Da sich die gespeicherte Prozedur jedoch in einer bereitgestellten Anwendung befindet, können Sie den Code der Anwendung nicht direkt ändern. Stattdessen können Sie den folgenden Planguide in der AdventureWorks2025-Datenbank erstellen.
sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT *FROM Sales.SalesOrderHeader AS h,
Sales.Customer AS c,
Sales.SalesTerritory AS t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = @Country_region',
@type = N'OBJECT',
@module_or_batch = N'Sales.GetSalesOrderByCountry',
@params = NULL,
@hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';
Wenn die in der sp_create_plan_guide -Anweisung angegebene Abfrage ausgeführt wird, wird sie vor der Optimierung so geändert, dass sie die OPTIMIZE FOR (@Country = N''US'') -Klausel enthält.
SQL-Planhinweis
Eine SQL-Plananleitung gleicht Abfragen ab, die im Kontext von eigenständigen Transact-SQL-Anweisungen und Batches ausgeführt werden, die nicht Teil eines Datenbankobjekts sind. SQL-basierte Planhinweise können auch verwendet werden, um Abfragen abzugleichen, die zu einer angegebenen Form parametrisiert werden. SQL-Planhinweise gelten für eigenständige Transact-SQL-Anweisungen und -Batches. Diese Anweisungen werden von einer Anwendung häufig mithilfe der gespeicherten Systemprozedur sp_executesql übermittelt. Betrachten Sie beispielsweise den folgenden eigenständigen Batch:
SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;
Um zu verhindern, dass ein paralleler Ausführungsplan für diese Abfrage generiert wird, erstellen Sie die folgende Planhinweisliste und legen den MAXDOP -Abfragehinweis im 1 -Parameter auf @hints fest.
sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MAXDOP 1)';
Sehen Sie sich als weiteres Beispiel die folgende SQL-Anweisung an, die mit sp_executesql übermittelt wird.
exec sp_executesql N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID = @so_id', N'@so_id int', @so_id = 43662;
Erstellen Sie die folgende Planhinweisliste, und verwenden Sie den Abfragehinweis OPTION (RECOMPILE) im Parameter @hints, um einen eindeutigen Plan für alle Ausführungen dieser Abfrage zu erstellen.
exec sp_create_plan_guide
@name = N'PlanGuide1_SalesOrders',
@stmt = N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID = @so_id',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@so_id int',
@hints = N'OPTION (recompile)';
Important
Die für das @module_or_batch -Argument und das @params -Argument der sp_create_plan guide -Anweisung angegebenen Werte müssen mit dem Text übereinstimmen, der in der Abfrage übermittelt wird. Weitere Informationen finden Sie unter sp_create_plan_guide (Transact-SQL) und Erstellen und Testen von Planhinweislisten mithilfe von SQL Server Profiler.
SQL-Planleitfäden können auch für Abfragen erstellt werden, die zur selben Form parametrisiert werden, wenn die Datenbankoption PARAMETERIZATION auf SET FORCED festgelegt ist oder wenn ein TEMPLATE-Planleitfaden erstellt wird, der eine parametrisierte Klasse von Abfragen angibt.
TEMPLATE Planleitfaden
Ein TEMPLATE-Planhinweis entspricht eigenständigen Abfragen, die zu einer angegebenen Form parametrisiert werden. Diese Planführungslinien werden verwendet, um die aktuelle PARAMETERIZATION-Datenbankoption SET einer Datenbank für eine Klasse von Abfragen außer Kraft zu setzen.
Sie können in einer der folgenden Situationen eine TEMPLATE-Plananleitung erstellen:
Die Datenbankoption PARAMETERIZATION ist auf SET FORCED festgelegt, aber es gibt Abfragen, die nach den Regeln von Simple Parameterization kompiliert werden sollen.
Die PARAMETERIZATION-Datenbankoption ist SET auf "SIMPLE" (Standardeinstellung), sie möchten jedoch, dass die erzwungene Parameterisierung für eine Klasse von Abfragen ausprobiert werden soll.
Abgleichsanforderungen für den Plan Guide
Planleitfäden gelten nur für die Datenbank, in der sie erstellt werden. Daher können nur die Planhinweise mit der Abfrage abgeglichen werden, die sich in der Datenbank befinden, die beim Ausführen einer Abfrage aktuell ist. Beispiel: Wenn AdventureWorks2025 die aktuelle Datenbank ist und die folgende Abfrage ausgeführt wird:
SELECT FirstName, LastName FROM Person.Person;
Nur Planleitfäden in der AdventureWorks2025-Datenbank können mit dieser Abfrage abgeglichen werden. Wenn jedoch AdventureWorks2025 die aktuelle Datenbank ist und die folgenden Anweisungen ausgeführt werden:
USE DB1;
SELECT FirstName, LastName FROM Person.Person;
Dann können nur in DB1 vorhandene Planhinweislisten mit dieser Abfrage verglichen werden, weil die Abfrage im Kontext von DB1ausgeführt wird.
Für SQL- oder TEMPLATE-basierte Planhinweise gleicht SQL Server die Werte für die Argumente @module_or_batch und @params mit einer Abfrage ab, indem die beiden Werte Zeichen für Zeichen verglichen werden. Das bedeutet, dass Sie den Text genau so bereitstellen müssen, wie er von SQL Server im tatsächlichen Batch empfangen wird.
Wenn @type = „SQL“ und @module_or_batch auf NULL festgelegt ist, wird der Wert von @module_or_batch auf den Wert von @stmt festgelegt. Dies bedeutet, dass der Wert für statement_text im exakt gleichen Format, Zeichen für Zeichen, angegeben werden muss, wie er an SQL Server übergeben wird. Es findet keine interne Konvertierung zur Vereinfachung dieses Abgleichs statt.
Wenn für eine Anweisung sowohl eine reguläre Planhinweisliste (SQL oder OBJECT) als auch eine TEMPLATE-Planhinweisliste gelten können, wird nur die reguläre Planhinweisliste verwendet.
Note
Der Batch, der die Anweisung enthält, für die Sie einen Planhinweis erstellen möchten, darf keine USE database-Anweisung enthalten.
Auswirkung von Planhinweisen auf den Plancache
Das Erstellen eines Planhinweises für ein Modul entfernt den Abfrageplan für dieses Modul aus dem Plancache. Wenn Sie eine Planhinweisliste des Typs OBJECT oder SQL für einen Batch erstellen, wird der Abfrageplan für einen Batch mit demselben Hashwert entfernt. Das Erstellen eines Planhinweises vom Typ TEMPLATE entfernt alle Ein-Anweisungs-Batches aus dem Plancache innerhalb dieser Datenbank.
Verwandte Aufgaben
| Task | Topic |
|---|---|
| Beschreibt, wie eine Planhinweisliste erstellt wird. | Leitfaden zum Erstellen eines neuen Plans |
| Beschreibt, wie ein Planleitfaden für parametrisierte Abfragen erstellt wird. | Planhinweis für parametrisierte Abfragen erstellen |
| Beschreibt, wie das Verhalten der Abfrageparametrisierung durch die Verwendung von Planhinweisen gesteuert wird. | Verhalten der Abfrageparametrisierung mithilfe von Planleitfäden angeben |
| Beschreibt, wie ein fester Abfrageplan in eine Planhinweisliste eingeschlossen wird. | Einen festen Abfrageplan auf einen Planhinweis anwenden |
| Beschreibt, wie Abfragehinweise in einem Plan Guide angegeben werden. | Abfragehinweise an eine Planhilfe anfügen |
| Beschreibt, wie Eigenschaften von Planhinweisen angezeigt werden. | Ansicht der Eigenschaften des Planguides |
| Beschreibt, wie SQL Server Profiler zum Erstellen und Testen von Planhinweisen verwendet wird. | Verwenden von SQL Server Profiler zum Erstellen und Testen von Planhinweislisten |
| Beschreibt, wie Planhinweise validiert werden. | Planhinweise nach dem Upgrade überprüfen |
Siehe auch
sp_create_plan_guide (Transact-SQL)
sp_create_plan_guide_from_handle (Transact-SQL)
sp_control_plan_guide (Transact-SQL)
sys.plan_guides (Transact-SQL)
sys.fn_validate_plan_guide (Transact-SQL)