Delen via


Geoptimaliseerd plan afdwingen met Query Store

Van toepassing op: SQL Server 2022 (16.x) Azure SQL Database SQL-databasein Microsoft Fabric

Queryoptimalisatie is een proces met meerdere fasen voor het genereren van een 'goed genoeg' queryuitvoeringsplan. In sommige gevallen kan querycompilatie, een onderdeel van queryoptimalisatie, een groot percentage van de totale uitvoeringstijd van query's vertegenwoordigen en aanzienlijke systeembronnen verbruiken. Geoptimaliseerd plan afdwingen maakt deel uit van de intelligente reeks functies voor het verwerken van query's. Het afdwingen van een geoptimaliseerd plan vermindert de compilatieoverhead voor herhalende geforceerde query's en vereist dat de Query Store is ingeschakeld en in de modus Lezen-Schrijven staat. Zodra het queryuitvoeringsplan is gegenereerd, worden specifieke compilatiestappen opgeslagen voor hergebruik als een optimalisatiescript voor opnieuw afspelen. Een script voor het opnieuw afspelen van optimalisatie wordt opgeslagen als onderdeel van de gecomprimeerde showplan XML in Query Store, in een verborgen OptimizationReplay kenmerk.

Geoptimaliseerd plan dat implementatie afdwingt

Wanneer een query voor het eerst het compilatieproces doorloopt, bepaalt een drempelwaarde op basis van de schatting van de tijd die is besteed aan optimalisatie (op basis van de invoerstructuur van de queryoptimalisatie) of er een optimalisatiescript voor opnieuw afspelen wordt gemaakt.

Nadat de compilatie is voltooid, zijn er verschillende runtimegegevens beschikbaar om te beoordelen of de vorige schatting juist was. Als de database-engine bevestigt dat de drempelwaarde is overschreden, komt het scenario voor het opnieuw afspelen van optimalisatie in aanmerking voor persistentie. Deze runtimegegevens omvatten het aantal objecten dat wordt geopend, het aantal joins, het aantal optimalisatietaken dat tijdens de optimalisatie wordt uitgevoerd en de werkelijke optimalisatietijd.

Het mogelijke voordeel van het gebruik van een optimalisatiescript voor het opnieuw afspelen wordt ook vergeleken met de overheadkosten van het opslaan van dit script. Een schatting van de relatieve tijd voor het opnieuw afspelen van het optimalisatiescript wordt vergeleken met de tijd die is besteed aan het uitvoeren van het normale optimalisatieproces. Deze schatting is gebaseerd op het aantal optimalisatietaken dat is opgeslagen in het script voor het opnieuw afspelen van optimalisatie en het aantal optimalisatietaken dat tijdens de normale compilatie wordt uitgevoerd. Als het herhalen van het scenario voor optimalisatieherhaling aanzienlijke voordelen oplevert bij het verminderen van de compilatietijd, blijft het script voor optimalisatieherhaling behouden.

Considerations

Wanneer de geoptimaliseerde functie voor het afdwingen van plannen is ingeschakeld, zijn de geschiktheidscriteria voor het afdwingen van een geoptimaliseerd plan:

  1. Alleen queryplannen die volledige optimalisatie doorlopen, komen in aanmerking, die kunnen worden geverifieerd door de aanwezigheid van de StatementOptmLevel="FULL" eigenschap.

  2. Instructies met de RECOMPILE-hint en gedistribueerde query's zijn niet geschikt.

Als de Query Store echter onafhankelijk een queryplan vastlegt dat is afgestemd op het afdwingen van een geoptimaliseerd plan, wordt het script voor optimalisatieherhaling gemaakt voor een tweede hercompilatie van diezelfde query, afhankelijk van standaardhercompilatiegebeurtenissen. Meer informatie over hercompilatie in uitvoeringsplannen voor hercompilatie.

Zelfs als er een script voor optimalisatieherhaling is gegenereerd, kan het niet worden bewaard in de Query Store als niet wordt voldaan aan de criteria voor het vastleggen van beleidsregels voor Query Store, met name het aantal uitvoeringen van die instructie en de cumulatieve compileer- en uitvoeringstijden. In dit geval wordt het ongeldige herplayscript voor optimalisatie asynchroon uit het geheugen verwijderd.

Geoptimaliseerd plan afdwingen in- en uitschakelen

U kunt geoptimaliseerde planforcing in- of uitschakelen voor een database. Wanneer het afdwingen van een geoptimaliseerd plan is ingeschakeld voor een database, kunt u deze uitschakelen voor afzonderlijke query's met behulp van de DISABLE_OPTIMIZED_PLAN_FORCING queryhint. U kunt ook geoptimaliseerde planning uitschakelen voor een queryplan dat wordt gedwongen in Query Store.

Geoptimaliseerd plan afdwingen voor een database in- of uitschakelen

Geoptimaliseerd plan afdwingen is standaard ingeschakeld voor nieuwe databases die zijn gemaakt in SQL Server 2022 (16.x) en hoger. De Query Store moet zijn ingeschakeld voor elke database waarin geoptimaliseerde planafdwinging wordt gebruikt. Bijgewerkte exemplaren met bestaande databases of databases die zijn hersteld vanuit een lagere versie van SQL Server, hebben standaard een geoptimaliseerd plan ingeschakeld.

Gebruik de configuratie van de ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON scope-instelling om het afdwingen van geoptimaliseerde plannen op databaseniveau mogelijk te maken. U moet Query Store inschakelen als deze nog niet is ingeschakeld. Zoek voorbeeldcode in Voorbeeld A of meer informatie over Query Store in Prestaties bewaken met behulp van de Query Store.

Als u de geoptimaliseerde planforcering op databaseniveau wilt uitschakelen, gebruikt u de databasebereikconfiguratie van ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = OFF.

Het geforceerd toepassen van een geoptimaliseerd plan uitschakelen met een queryhint

Wanneer de functie voor het afdwingen van een geoptimaliseerd plan is ingeschakeld in een database, kunt u geoptimaliseerd plan afdwingen voor een afzonderlijke query uitschakelen met behulp van de DISABLE_OPTIMIZED_PLAN_FORCINGqueryhint.

Zoek een voorbeeld van het toepassen van deze queryhint in voorbeeld E.

Een plan afdwingen met Query Store, maar het afdwingen van geoptimaliseerde plannen uitschakelen

De sp_query_store_force_plan procedure bevat een disable_optimized_plan_forcing parameter. Als u deze parameter wilt gebruiken, moet de sp_query_store_force_plan opgeslagen procedure een extra parameter hebben. De extra parameter wordt aangeroepen @replica_group_id. Standaard heeft de primaire @replica_group_id waarde een (1) waarde, zelfs in het geval dat er geen secundaire replica's zijn geconfigureerd.

Zoek een voorbeeld van het toepassen van de juiste parameters op de sp_query_store_force_plan opgeslagen procedure in voorbeeld C.

De sys.query_store_plan catalogusweergave bevat kolommen die aangeven of het plan een gekoppeld scenario voor het opnieuw afspelen van optimalisatie heeft en een nieuwe status toevoegt aan een bestaande foutredenkolom die specifiek is voor het gekoppelde scenario voor het opnieuw afspelen van optimalisatie. Meer informatie vindt u in sys.query_store_plan.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

A. Query Store en geoptimaliseerd plan inschakelen voor het afdwingen van een database

Met de volgende code wordt de Query Store op een database ingeschakeld en vervolgens het afdwingen van geoptimaliseerde plannen in de database ingeschakeld. Meer informatie over opties voor het inschakelen van Query Store in ALTER DATABASE SET-opties.

Voordat u de code uitvoert, maakt u verbinding met de juiste gebruikersdatabase.

ALTER DATABASE CURRENT SET QUERY_STORE = ON
(
    OPERATION_MODE = READ_WRITE,
    CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 90),
    DATA_FLUSH_INTERVAL_SECONDS = 900,
    QUERY_CAPTURE_MODE = AUTO,
    MAX_STORAGE_SIZE_MB = 1024,
    INTERVAL_LENGTH_MINUTES = 60
);
GO

ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_PLAN_FORCING = ON;
GO

B. Selecteer alle query's met een optimalisatiescript voor opnieuw afspelen

De volgende voorbeeldcode selecteert alle query_ids met een optimalisatiescript voor opnieuw afspelen in Query Store. Maak verbinding met de juiste gebruikersdatabase voordat u de voorbeeldcode uitvoert.

SELECT q.query_id,
       t.query_sql_text,
       p.plan_id,
       TRY_CAST (p.query_plan AS XML) AS query_plan,
       p.is_forced_plan,
       p.count_compiles
FROM sys.query_store_plan AS p
     INNER JOIN sys.query_store_query AS q
         ON p.query_id = q.query_id
     INNER JOIN sys.query_store_query_text AS t
         ON q.query_text_id = t.query_text_id
WHERE p.has_compile_replay_script = 1;
GO

C. Een plan forceren en het forceren van geoptimaliseerde plannen uitschakelen in Query Store

Met de volgende code wordt een plan in Query Store afgedwongen, maar wordt het geforceerd toepassen van een geoptimaliseerd plan uitgeschakeld. Voordat u de volgende code uitvoert, vervangt u @query_id en @plan_id door een combinatie die geschikt is voor uw exemplaar. In de opgeslagen procedure sp_query_store_force_plan wordt verwacht dat de parameter @replica_group_id wordt doorgegeven als de derde parameterwaarde bij poging tot het uitschakelen van geoptimaliseerde planforcering in Query Store. Dit kan worden gebruikt om het afdwingen van geoptimaliseerde plannen uit te schakelen voor een specifiek geforceerd plan op een specifieke replica. Er wordt een waarde gebruikt @replica_group_id = 1 om de functie op de primaire replica uit te schakelen.

EXECUTE sp_query_store_force_plan
    @query_id = 148,
    @plan_id = 4,
    @replica_group_id = 1,
    @disable_optimized_plan_forcing = 1;
GO

Meer informatie vindt u in sp_query_store_force_plan.

D. Selecteer alle queries waarbij het forceren van geoptimaliseerde plannen is uitgeschakeld door Query Store.

In het volgende voorbeeld worden alle plannen opgevraagd die zijn geforceerd in Query Store waar is_optimized_plan_forcing_disabled is ingesteld op 1. Voordat u de code uitvoert, maakt u verbinding met de juiste gebruikersdatabase.

SELECT q.query_id,
       t.query_sql_text,
       p.plan_id,
       TRY_CAST (p.query_plan AS XML) AS query_plan,
       p.is_forced_plan,
       p.count_compiles
FROM sys.query_store_plan AS p
     INNER JOIN sys.query_store_query AS q
         ON p.query_id = q.query_id
     INNER JOIN sys.query_store_query_text AS t
         ON q.query_text_id = t.query_text_id
WHERE p.is_optimized_plan_forcing_disabled = 1;
GO

E. "Geoptimaliseerde planforcing voor een query uitschakelen"

In het volgende voorbeeld wordt het geoptimaliseerde plan voor een query uitgeschakeld met behulp van de DISABLE_OPTIMIZED_PLAN_FORCINGqueryhint.

SELECT ProductID,
       OrderQty,
       SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (USE HINT('DISABLE_OPTIMIZED_PLAN_FORCING'));
GO