Anwenden eines festen Abfrageplans auf eine Planhinweisliste

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Sie können einen festen Abfrageplan auf einen Planguide des Typs OBJECT oder SQL anwenden. Planhinweise, die einen festen Abfrageplan anwenden, sind hilfreich, wenn Sie wissen, dass ein vorhandener Ausführungsplan für eine bestimmte Abfrage eine bessere Leistung bietet als der vom Abfrageoptimierer ausgewählte Ausführungsplan.

Im folgenden Beispiel wird ein Planhinweis für eine einfache Ad-hoc-SQL-Anweisung erstellt. Der gewünschte Abfrageplan für diese Anweisung wird im Planhinweis durch die direkte Angabe des XML-Showplans für die Abfrage im @hints-Parameter bereitgestellt. Im Beispiel wird zunächst die SQL-Anweisung ausgeführt, um einen Plan im Plancache zu erzeugen. Dabei wird davon ausgegangen, dass der erzeugte Plan dem gewünschten Plan entspricht und keine weitere Optimierung der Abfrage erforderlich ist. Der XML-Showplan für die Abfrage wird durch eine Abfrage der dynamischen Verwaltungssichten sys.dm_exec_query_stats, sys.dm_exec_sql_text und sys.dm_exec_text_query_plan abgerufen und der Variablen @xml_showplan zugewiesen. Die @xml_showplan -Variable wird dann im sp_create_plan_guide -Parameter an die @hints -Anweisung übergeben. Alternativ können Sie die gespeicherte Prozedur sp_create_plan_guide_from_handle verwenden, um einen Planleitfaden aus einem Abfrageplan im Plancache zu erstellen.

Verbinden Sie sich mit der AdventureWorks2022 Beispieldatenbank, die Person.Address enthält, und führen Sie das folgende Codebeispiel aus, um einen Planleitfaden zu erstellen.

SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;  
GO  
DECLARE @xml_showplan nvarchar(max);  
SET @xml_showplan = (SELECT query_plan  
    FROM sys.dm_exec_query_stats AS qs   
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st  
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp  
    WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%');  
  
EXEC sp_create_plan_guide   
    @name = N'Guide1_from_XML_showplan',   
    @stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = @xml_showplan;  
GO