Delen via


sys.dm_db_tuning_recommendations (Transact-SQL)

Van toepassing op: SQL Server 2017 (14.x) en latere versies Van Azure SQL DatabaseAzure SQL Managed Instance

Retourneert gedetailleerde informatie over aanbevelingen voor automatisch afstemmen. Zie Automatisch afstemmen voor meer informatie

Zie Bewaking en prestaties afstemmen in Azure SQL Database en Azure SQL Managed Instance voor meer informatie.

In Azure SQL Database kunnen dynamische beheerweergaven geen informatie weergeven die van invloed is op databaseinsluiting of informatie weergeven over andere databases waartoe de gebruiker toegang heeft. Om te voorkomen dat deze informatie zichtbaar wordt gemaakt, wordt elke rij met gegevens die geen deel uitmaken van de verbonden tenant uitgefilterd.

Kolomnaam Gegevenstype Beschrijving
name nvarchar(4000) Unieke naam van aanbeveling.
type nvarchar(4000) De naam van de optie voor automatisch afstemmen die de aanbeveling heeft geproduceerd, bijvoorbeeld FORCE_LAST_GOOD_PLAN
reden nvarchar(4000) Reden waarom deze aanbeveling is opgegeven.
valid_since datetime2 De eerste keer dat deze aanbeveling is gegenereerd.
last_refresh datetime2 De laatste keer dat deze aanbeveling is gegenereerd.
state nvarchar(4000) JSON-document waarin de status van de aanbeveling wordt beschreven. De volgende velden zijn beschikbaar:
- currentValue - huidige status van de aanbeveling.
- reason - constante die beschrijft waarom de aanbeveling de huidige status heeft.
is_executable_action bit 1 = De aanbeveling kan worden uitgevoerd op de database via Transact-SQL script.
0 = De aanbeveling kan niet worden uitgevoerd voor de database (bijvoorbeeld: alleen informatie of teruggedraaide aanbeveling)
is_revertable_action bit 1 = De aanbeveling kan automatisch worden bewaakt en teruggedraaid door de database-engine.
0 = De aanbeveling kan niet automatisch worden bewaakt en teruggedraaid. De meeste uitvoerbare acties kunnen worden teruggedraaid.
execute_action_start_time datetime2 Datum waarop de aanbeveling wordt toegepast.
execute_action_duration time Duur van de uitvoeringsactie.
execute_action_initiated_by nvarchar(4000) User = Handmatig geforceerd plan van gebruiker in de aanbeveling.
System = Systeem automatisch toegepaste aanbeveling.
execute_action_initiated_time datetime2 De datum waarop de aanbeveling is toegepast.
revert_action_start_time datetime2 De datum waarop de aanbeveling is teruggedraaid.
revert_action_duration time Duur van de terugdraaiactie.
revert_action_initiated_by nvarchar(4000) User = Handmatig niet-afgedwongen aanbevolen plan door gebruiker.
System = Aanbeveling voor automatisch teruggedraaid systeem.
revert_action_initiated_time datetime2 De datum waarop de aanbeveling is teruggedraaid.
partituur int Geschatte waarde/effect voor deze aanbeveling op de schaal 0-100 (hoe groter des te beter)
bijzonderheden nvarchar(max) JSON-document met meer informatie over de aanbeveling. De volgende velden zijn beschikbaar:

planForceDetails
- queryId - query_id van de teruggedraaide query.
- regressedPlanId - plan_id van het teruggedraaide plan.
- regressedPlanExecutionCount - Aantal uitvoeringen van de query met teruggedraaid plan voordat de regressie wordt gedetecteerd.
- regressedPlanAbortedCount - Aantal gedetecteerde fouten tijdens de uitvoering van het teruggedraaide plan.
- regressedPlanCpuTimeAverage - Gemiddelde CPU-tijd (in micro seconden) die door de teruggedraaide query wordt verbruikt voordat de regressie wordt gedetecteerd.
- regressedPlanCpuTimeStddev - Standaarddeviatie van de CPU-tijd die door de teruggedraaide query wordt verbruikt voordat de regressie wordt gedetecteerd.
- recommendedPlanId - plan_id van het plan dat moet worden gedwongen.
- recommendedPlanExecutionCount- Aantal uitvoeringen van de query met het plan dat moet worden afgedwongen voordat de regressie wordt gedetecteerd.
- recommendedPlanAbortedCount - Aantal gedetecteerde fouten tijdens de uitvoering van het plan dat moet worden gedwongen.
- recommendedPlanCpuTimeAverage - Gemiddelde CPU-tijd (in micro seconden) die wordt verbruikt door de query die wordt uitgevoerd met het plan dat moet worden geforceerd (berekend voordat de regressie wordt gedetecteerd).
- recommendedPlanCpuTimeStddev Standaarddeviatie van de CPU-tijd die wordt verbruikt door de teruggedraaide query voordat de regressie wordt gedetecteerd.

implementationDetails
- method - De methode die moet worden gebruikt om de regressie te corrigeren. Waarde is altijd TSql.
- script - Transact-SQL script dat moet worden uitgevoerd om het aanbevolen plan af te dwingen.

Opmerkingen

Informatie die wordt geretourneerd door sys.dm_db_tuning_recommendations , wordt bijgewerkt wanneer de database-engine potentiële regressie van queryprestaties identificeert en niet persistent is. Aanbevelingen worden alleen bewaard totdat de database-engine opnieuw wordt opgestart. Gebruik de kolom sqlserver_start_time in sys.dm_os_sys_info om de laatste opstarttijd van de database-engine te vinden. Databasebeheerders moeten regelmatig back-ups maken van de aanbeveling voor afstemming als ze deze willen bewaren na het recyclen van de server.

Het currentValue veld in de state kolom heeft mogelijk de volgende waarden:

Toestand Description
Active Aanbeveling is actief en is nog niet toegepast. Gebruiker kan het aanbevelingsscript gebruiken en handmatig uitvoeren.
Verifying Aanbeveling wordt toegepast door database-engine en het interne verificatieproces vergelijkt de prestaties van het geforceerde plan met het teruggedraaide plan.
Success Aanbeveling wordt toegepast.
Reverted Aanbeveling wordt teruggedraaid omdat er geen aanzienlijke prestatieverbeteringen zijn.
Expired Aanbeveling is verlopen en kan niet meer worden toegepast.

JSON-document in state kolom bevat de reden waarom wordt beschreven waarom de aanbeveling de huidige status heeft. Waarden in het redenveld kunnen het volgende zijn:

Reden Description
SchemaChanged Aanbeveling is verlopen omdat het schema van een tabel waarnaar wordt verwezen, wordt gewijzigd. Er wordt een nieuwe aanbeveling gemaakt als er een nieuwe regressie voor het queryplan wordt gedetecteerd in het nieuwe schema.
StatisticsChanged Aanbeveling is verlopen vanwege de statistiekwijziging in een tabel waarnaar wordt verwezen. Er wordt een nieuwe aanbeveling gemaakt als er een nieuwe regressie voor het queryplan wordt gedetecteerd op basis van nieuwe statistieken.
ForcingFailed Het aanbevolen plan kan niet worden afgedwongen voor een query. Zoek de last_force_failure_reason in de weergave sys.query_store_plan om de reden van de fout te achterhalen.
AutomaticTuningOptionDisabled FORCE_LAST_GOOD_PLAN de optie is uitgeschakeld door de gebruiker tijdens het verificatieproces. Schakel FORCE_LAST_GOOD_PLAN de optie in met de instructie ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) of forceer het plan handmatig met behulp van het script in de details kolom.
UnsupportedStatementType Het plan kan niet worden afgedwongen voor de query. Voorbeelden van niet-ondersteunde query's zijn cursors en INSERT BULK instructies.
LastGoodPlanForced Aanbeveling wordt toegepast.
AutomaticTuningOptionNotEnabled Database-engine heeft mogelijke regressie van prestaties geïdentificeerd, maar de FORCE_LAST_GOOD_PLAN optie is niet ingeschakeld. Zie ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Pas de aanbeveling handmatig toe of schakel de optie in FORCE_LAST_GOOD_PLAN .
VerificationAborted Verificatieproces wordt afgebroken vanwege het opnieuw opstarten of opschonen van Query Store.
VerificationForcedQueryRecompile Query wordt opnieuw gecompileerd omdat er geen aanzienlijke prestatieverbetering is.
PlanForcedByUser Gebruiker dwong het plan handmatig af met behulp van sp_query_store_force_plan (Transact-SQL) procedure. De database-engine past de aanbeveling niet toe als de gebruiker expliciet heeft besloten om een plan af te dwingen.
PlanUnforcedByUser Gebruiker heeft het plan handmatig niet afgedwongen met behulp van sp_query_store_unforce_plan (Transact-SQL) procedure. Omdat de gebruiker het aanbevolen plan expliciet heeft teruggedraaid, blijft de database-engine het huidige plan gebruiken en genereert een nieuwe aanbeveling als er in de toekomst een planregressie plaatsvindt.
UserForcedDifferentPlan Gebruiker dwong handmatig een ander plan af met behulp van sp_query_store_force_plan (Transact-SQL) procedure. De database-engine past de aanbeveling niet toe als de gebruiker expliciet heeft besloten om een plan af te dwingen.
TempTableChanged Een tijdelijke tabel die in het plan is gebruikt, wordt gewijzigd.

Statistieken in de details kolom bevatten geen statistieken van runtimeplannen (bijvoorbeeld de huidige CPU-tijd). De details van de aanbeveling worden genomen op het moment van regressiedetectie en beschrijven waarom database-engine prestatieregressie heeft geïdentificeerd. Gebruik regressedPlanId en recommendedPlanId om query's uit te voeren op query store-catalogusweergaven om exacte statistieken van runtime-plannen te vinden.

Voorbeelden van het gebruik van informatie over het afstemmen van aanbevelingen

Voorbeeld 1

De volgende voorbeeldcode haalt het gegenereerde Transact-SQL script op dat een goed plan voor een bepaalde query dwingt:

SELECT name,
    reason,
    score,
    JSON_VALUE(details, '$.implementationDetails.script') AS script,
    details.*
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(details, '$.planForceDetails') WITH (
        [query_id] INT '$.queryId',
        regressed_plan_id INT '$.regressedPlanId',
        last_good_plan_id INT '$.recommendedPlanId'
        ) AS details
WHERE JSON_VALUE(STATE, '$.currentValue') = 'Active';

Voorbeeld 2

Hieronder wordt het gegenereerde Transact-SQL script opgehaald dat een goed plan voor een bepaalde query afdingt en aanvullende informatie over de geschatte winst:

SELECT reason,
    score,
    script = JSON_VALUE(details, '$.implementationDetails.script'),
    planForceDetails.*,
    estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) * (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
    error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
        [query_id] INT '$.queryId',
        regressedPlanId INT '$.regressedPlanId',
        recommendedPlanId INT '$.recommendedPlanId',
        regressedPlanErrorCount INT,
        recommendedPlanErrorCount INT,
        regressedPlanExecutionCount INT,
        regressedPlanCpuTimeAverage FLOAT,
        recommendedPlanExecutionCount INT,
        recommendedPlanCpuTimeAverage FLOAT
        ) AS planForceDetails;

Voorbeeld 3

Hieronder wordt het gegenereerde Transact-SQL script opgehaald waarmee een goed plan wordt afgevangen voor een bepaalde query en aanvullende informatie die de querytekst en de queryplannen bevat die zijn opgeslagen in Query Store:

WITH cte_db_tuning_recommendations
AS (
    SELECT reason,
        score,
        query_id,
        regressedPlanId,
        recommendedPlanId,
        current_state = JSON_VALUE(STATE, '$.currentValue'),
        current_state_reason = JSON_VALUE(STATE, '$.reason'),
        script = JSON_VALUE(details, '$.implementationDetails.script'),
        estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) *
                         (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
        error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
    FROM sys.dm_db_tuning_recommendations
    CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
            [query_id] INT '$.queryId',
            regressedPlanId INT '$.regressedPlanId',
            recommendedPlanId INT '$.recommendedPlanId',
            regressedPlanErrorCount INT,
            recommendedPlanErrorCount INT,
            regressedPlanExecutionCount INT,
            regressedPlanCpuTimeAverage FLOAT,
            recommendedPlanExecutionCount INT,
            recommendedPlanCpuTimeAverage FLOAT
            )
    )
SELECT qsq.query_id,
    qsqt.query_sql_text,
    dtr.*,
    CAST(rp.query_plan AS XML) AS RegressedPlan,
    CAST(sp.query_plan AS XML) AS SuggestedPlan
FROM cte_db_tuning_recommendations AS dtr
INNER JOIN sys.query_store_plan AS rp
    ON rp.query_id = dtr.query_id
        AND rp.plan_id = dtr.regressedPlanId
INNER JOIN sys.query_store_plan AS sp
    ON sp.query_id = dtr.query_id
        AND sp.plan_id = dtr.recommendedPlanId
INNER JOIN sys.query_store_query AS qsq
    ON qsq.query_id = rp.query_id
INNER JOIN sys.query_store_query_text AS qsqt
    ON qsqt.query_text_id = qsq.query_text_id;

Zie JSON-ondersteuning in Database Engine voor meer informatie over JSON-functies die kunnen worden gebruikt voor het opvragen van waarden in de aanbevelingsweergave.

Permissions

Hiervoor is een machtiging in SQL Server vereist VIEW SERVER STATE .

Vereist de VIEW DATABASE STATE machtiging voor de database in Azure SQL Database.

Machtigingen voor SQL Server 2022 en hoger

Hiervoor is machtiging vereist VIEW SERVER PERFORMANCE STATE op de server.

Volgende stappen