Planhandleidingen
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Belangrijk
Query Store-hints een eenvoudiger te gebruiken methode bieden voor het vormgeven van queryplannen zonder toepassingscode te wijzigen. Query Store-hints zijn eenvoudiger dan planhandleidingen. Query Store-hints zijn beschikbaar in Azure SQL Database, SQL-database in Microsoft Fabric, Azure SQL Managed Instance en in SQL Server 2022 (16.x) en latere versies.
Met planhandleidingen kunt u de prestaties van query's optimaliseren wanneer u de tekst van de werkelijke query in SQL Server niet of niet rechtstreeks wilt wijzigen. Plangidsen beïnvloeden de optimalisatie van query's door aanwijzingen voor query's of een vaste query-planning eraan toe te voegen. Planhandleidingen kunnen handig zijn wanneer een kleine subset van query's in een databasetoepassing die wordt geleverd door een externe leverancier, niet werkt zoals verwacht. In de plangids specificeert u de Transact-SQL instructie die u wilt optimaliseren en ofwel een OPTION-component met de queryhints die u wilt gebruiken, of een specifiek queryplan dat u wilt gebruiken om de query te optimaliseren. Wanneer de query wordt uitgevoerd, komt de Transact-SQL-instructie overeen met de planhandleiding en koppelt de OPTION-component aan de query tijdens de uitvoering of gebruikt het opgegeven queryplan. Omdat sql Server Query Optimizer doorgaans het beste uitvoeringsplan voor een query selecteert, raden we u aan alleen planhandleidingen te gebruiken als laatste redmiddel voor ervaren ontwikkelaars en databasebeheerders.
Het totale aantal planhandleidingen dat u kunt maken, is alleen beperkt door beschikbare systeembronnen. Planhandleidingen moeten echter worden beperkt tot bedrijfskritieke query's die gericht zijn op verbeterde of gestabiliseerde prestaties. Planhandleidingen mogen niet worden gebruikt om de meeste querybelasting van een geïmplementeerde toepassing te beïnvloeden.
Het resulterende uitvoeringsplan dat door deze functie wordt gedwongen, is hetzelfde of vergelijkbaar met het plan dat wordt gedwongen. Omdat het resulterende plan mogelijk niet identiek is aan het plan dat is opgegeven in de planhandleiding, kunnen de prestaties van de plannen variëren. In zeldzame gevallen kan het prestatieverschil aanzienlijk en negatief zijn; In dat geval moet de beheerder het geforceerde plan verwijderen.
Planhandleidingen kunnen niet worden gebruikt in elke editie van Microsoft SQL Server. Zie Functies die worden ondersteund door de edities van SQL Server 2016voor een lijst met functies die worden ondersteund door de edities van SQL Server 2016. Planhandleidingen zijn zichtbaar in elke editie. U kunt ook een database met planhandleidingen toevoegen aan elke editie. Planhandleidingen blijven intact wanneer u een database herstelt of koppelt aan een bijgewerkte versie van SQL Server.
Typen planhandleidingen
De volgende typen planhandleidingen kunnen worden gemaakt.
Handleiding voor OBJECTplan
Een handleiding voor objectplannen komt overeen met query's die worden uitgevoerd in de context van Transact-SQL opgeslagen procedures, scalaire door de gebruiker gedefinieerde functies, tabelgedefinieerde functies met meerdere instructies en DML-triggers.
Stel dat de volgende opgeslagen procedure, die de parameter @Country_region
gebruikt, zich in een databasetoepassing bevindt die is geïmplementeerd op basis van de AdventureWorks2022
-database:
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;
Stel dat deze opgeslagen procedure is gecompileerd en geoptimaliseerd voor @Country_region = N'AU'
(Australië). Omdat er echter relatief weinig verkooporders zijn die afkomstig zijn uit Australië, nemen de prestaties af wanneer de query wordt uitgevoerd met behulp van parameterwaarden van landen/regio's met meer verkooporders. Omdat de meeste verkooporders afkomstig zijn uit de Verenigde Staten, zou een queryplan dat wordt gegenereerd voor @Country_region = N'US'
waarschijnlijk beter presteren voor alle mogelijke waarden van de parameter @Country_region
.
U kunt dit probleem oplossen door de opgeslagen procedure te wijzigen om de OPTIMIZE FOR
queryhint toe te voegen aan de query. Omdat de opgeslagen procedure zich echter in een geïmplementeerde toepassing bevindt, kunt u de toepassingscode niet rechtstreeks wijzigen. In plaats daarvan kunt u de volgende planhandleiding maken in de AdventureWorks2022
-database.
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''))';
Wanneer de query die is opgegeven in de instructie sp_create_plan_guide
wordt uitgevoerd, wordt de query gewijzigd voordat de optimalisatie de OPTIMIZE FOR (@Country = N''US'')
component opneemt.
Handleiding voor SQL-plan
Een SQL-planhandleiding komt overeen met query's die worden uitgevoerd in de context van zelfstandige Transact-SQL-instructies en batches die geen deel uitmaken van een databaseobject. Op SQL gebaseerde planhandleidingen kunnen ook worden gebruikt om query's te vinden die worden geparameteriseerd naar een opgegeven formulier. SQL-planhandleidingen zijn van toepassing op zelfstandige Transact-SQL instructies en batches. Deze instructies worden vaak door een toepassing ingediend met behulp van de in het systeem opgeslagen procedure sp_executesql. Denk bijvoorbeeld aan de volgende zelfstandige batch:
SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;
Als u wilt voorkomen dat een parallel uitvoeringsplan voor deze query wordt gegenereerd, maakt u de volgende planhandleiding en stelt u de MAXDOP
queryhint in op 1
in de parameter @hints
.
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)';
Denk bijvoorbeeld aan de volgende SQL-instructie die is ingediend met behulp van sp_executesql.
exec sp_executesql N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID = @so_id', N'@so_id int', @so_id = 43662;
Als u een uniek plan wilt maken voor elke uitvoering van deze query, maakt u de volgende planhandleiding en gebruikt u de OPTION (RECOMPILE)
queryhint in de parameter @hints
.
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)';
Belangrijk
De waarden die worden opgegeven voor de argumenten @module_or_batch
en @params
van de instructie sp_create_plan guide
moeten overeenkomen met de bijbehorende tekst die in de werkelijke query is ingediend. Zie sp_create_plan_guide (Transact-SQL) en Gebruik SQL Server Profiler om Plan Guides te maken en te testen.
SQL plan-gidsen kunnen ook worden gemaakt op query's die parameteriseren naar hetzelfde formulier wanneer de PARAMETERIZATION databaseoptie is ingesteld op GEFORCEERD, of wanneer een sjabloonplan-gids wordt gemaakt die een geparameteriseerde klasse van query's specificeert.
Handleiding sjabloonplan
Een sjabloonplangids komt overeen met zelfstandige zoekopdrachten die geparametreerd zijn naar een opgegeven formulier. Deze plangidsen worden gebruikt om de huidige PARAMETERIZATION-database SET-optie van een database voor een klasse van query's te overschrijven.
U kunt een sjabloonplanhandleiding maken in een van de volgende situaties:
De PARAMETERIZATION-databaseoptie is INGESTELD op GEFORCEERDE, maar er zijn query's die u wilt compileren volgens de regels van Eenvoudige parameterisatie.
De databaseoptie voor PARAMETERIZATION is ingesteld op SIMPLE (de standaardinstelling), maar u wilt geforceerde parameterisatie proberen op een reeks van query's.
Overeenkomende vereisten voor planhandleiding
Planhandleidingen zijn gericht op de database waarin ze worden gemaakt. Daarom kunnen alleen planhandleidingen die zich in de database bevinden die actueel zijn wanneer een query wordt uitgevoerd, worden vergeleken met de query. Als AdventureWorks2022
bijvoorbeeld de huidige database is en de volgende query wordt uitgevoerd:
SELECT FirstName, LastName FROM Person.Person;
Alleen planhandleidingen in de AdventureWorks2022
-database komen in aanmerking voor overeenkomst met deze query. Als AdventureWorks2022
echter de huidige database is en de volgende instructies worden uitgevoerd:
USE DB1;
SELECT FirstName, LastName FROM Person.Person;
Alleen plangidsen in DB1
komen in aanmerking om te worden gekoppeld aan de query omdat de query wordt uitgevoerd binnen de context van DB1
.
Voor SQL- of sjabloonbasishandleidingen vergelijkt SQL Server de waarden voor de @module_or_batch en @params argumenten met een query door de waarden karakter voor karakter te vergelijken. Dit betekent dat u de tekst precies moet opgeven zoals SQL Server deze in de werkelijke batch ontvangt.
Wanneer @type = 'SQL' en @module_or_batch is ingesteld op NULL, wordt de waarde van @module_or_batch ingesteld op de waarde van @stmt. Dit betekent dat de waarde voor statement_text moet worden opgegeven in dezelfde notatie, teken-voor-teken, zoals deze wordt verzonden naar SQL Server. Er wordt geen interne conversie uitgevoerd om deze aansluiting te vergemakkelijken.
Wanneer zowel een standaard planhandleiding (SQL of OBJECT) als een SJABLOON planhandleiding op een instructie van toepassing is, wordt alleen de standaard planhandleiding gebruikt.
Notitie
De batch die de instructie bevat waarvoor u een planhandleiding wilt maken, mag geen USE database instructie bevatten.
Effect van de plangids op de plancache
Door een planhandleiding voor een module te maken, verwijdert u het queryplan voor die module uit de plancache. Wanneer u een planhandleiding van het type OBJECT of SQL in een batch aanmaakt, wordt het queryplan verwijderd voor een batch met dezelfde hash-waarde. Als u een planhandleiding van het type SJABLOON maakt, worden alle batches met één instructie uit de plancache in die database verwijderd.
Gerelateerde taken
Taak | Onderwerp |
---|---|
Hierin wordt beschreven hoe u een planhandleiding maakt. | een nieuwe planhandleiding maken |
Beschrijft hoe u een planhandleiding maakt voor geparameteriseerde query's. | een planhandleiding maken voor geparameteriseerde query's |
Hierin wordt beschreven hoe u het gedrag van queryparameterisatie kunt beheren met behulp van planhandleidingen. | Specificeer query-parameterisatiegedrag met behulp van plan-gidsen |
Hierin wordt beschreven hoe u een vast queryplan opneemt in een planhandleiding. | Een vast queryplan toepassen op een plangids |
Hierin wordt beschreven hoe u queryhints opgeeft in een planhandleiding. | queryhints toevoegen aan een planhandleiding |
Hierin wordt beschreven hoe u eigenschappen van planhandleidingen kunt weergeven. | Eigenschappen van planhandleiding weergeven |
Hierin wordt beschreven hoe u SQL Server Profiler gebruikt om handleidingen voor plannen te maken en te testen. | SQL Server Profiler gebruiken om planhandleidingen te maken en te testen |
Hierin wordt beschreven hoe u planhandleidingen valideert. | Planhandleidingen valideren na de upgrade |
Zie ook
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)