Dela via


sys.dm_db_tuning_recommendations (Transact-SQL)

Gäller för: SQL Server 2017 (14.x) och senare versioner Av Azure SQL DatabaseAzure SQL Managed Instance

Returnerar detaljerad information om rekommendationer för automatisk justering. Mer information finns i Automatisk justering

Mer information finns i Övervakning och prestandajustering i Azure SQL Database och Azure SQL Managed Instance.

I Azure SQL Database kan dynamiska hanteringsvyer inte exponera information som skulle påverka databasens inneslutning eller exponera information om andra databaser som användaren har åtkomst till. För att undvika att exponera den här informationen filtreras varje rad som innehåller data som inte tillhör den anslutna klientorganisationen bort.

Kolumnnamn Datatyp Beskrivning
name nvarchar(4000) Unikt namn på rekommendationen.
type nvarchar(4000) Namnet på det alternativ för automatisk justering som skapade rekommendationen, till exempel FORCE_LAST_GOOD_PLAN
orsak nvarchar(4000) Orsak till varför den här rekommendationen har angetts.
valid_since datetime2 Första gången den här rekommendationen genererades.
last_refresh datetime2 Senast den här rekommendationen genererades.
state nvarchar(4000) JSON-dokument som beskriver tillståndet för rekommendationen. Följande fält är tillgängliga:
- currentValue – rekommendationens aktuella tillstånd.
- reason - konstant som beskriver varför rekommendationen är i aktuellt tillstånd.
is_executable_action bit 1 = Rekommendationen kan köras mot databasen via Transact-SQL skript.
0 = Rekommendationen kan inte köras mot databasen (till exempel endast information eller återställd rekommendation)
is_revertable_action bit 1 = Rekommendationen kan övervakas automatiskt och återställas av databasmotorn.
0 = Rekommendationen kan inte övervakas och återställas automatiskt. De flesta körbara åtgärder är revererbara.
execute_action_start_time datetime2 Datum då rekommendationen tillämpas.
execute_action_duration time Varaktighet för körningsåtgärden.
execute_action_initiated_by nvarchar(4000) User = Manuellt framtvingad plan för användare i rekommendationen.
System = Systemet tillämpade automatiskt rekommendationen.
execute_action_initiated_time datetime2 Datum då rekommendationen tillämpades.
revert_action_start_time datetime2 Datum då rekommendationen återställdes.
revert_action_duration time Återställningsåtgärdens varaktighet.
revert_action_initiated_by nvarchar(4000) User = Användaren manuellt oforcerat rekommenderad plan.
System = Systemet återställde automatiskt rekommendationen.
revert_action_initiated_time datetime2 Datum då rekommendationen återställdes.
tjog int Uppskattat värde/effekt för den här rekommendationen på skalan 0–100 (ju större desto bättre)
Detaljer nvarchar(max) JSON-dokument som innehåller mer information om rekommendationen. Följande fält är tillgängliga:

planForceDetails
- queryId – query_id av den regresserade frågan.
- regressedPlanId - plan_id av den regresserade planen.
- regressedPlanExecutionCount – Antal körningar av frågan med regresserad plan innan regressionen identifieras.
- regressedPlanAbortedCount – Antal identifierade fel under körningen av den regresserade planen.
- regressedPlanCpuTimeAverage – Genomsnittlig CPU-tid (i mikro sekunder) som förbrukas av den regresserade frågan innan regressionen identifieras.
- regressedPlanCpuTimeStddev – Standardavvikelse för cpu-tid som förbrukas av den regresserade frågan innan regressionen identifieras.
- recommendedPlanId - plan_id av planen som borde tvingas.
- recommendedPlanExecutionCount– Antal körningar av frågan med planen som ska tvingas innan regressionen identifieras.
- recommendedPlanAbortedCount - Antal identifierade fel under körningen av planen som ska tvingas.
- recommendedPlanCpuTimeAverage – Genomsnittlig CPU-tid (i mikrosekunder) som förbrukas av frågan som körs med planen som ska tvingas (beräknas innan regressionen identifieras).
- recommendedPlanCpuTimeStddev Standardavvikelse för cpu-tid som förbrukas av den regresserade frågan innan regressionen identifieras.

implementationDetails
- method – Den metod som ska användas för att korrigera regressionen. Värdet är alltid TSql.
- script – Transact-SQL skript som ska köras för att framtvinga den rekommenderade planen.

Anmärkningar

Information som returneras av sys.dm_db_tuning_recommendations uppdateras när databasmotorn identifierar potentiell regression av frågeprestanda och inte sparas. Rekommendationer behålls endast tills databasmotorn startas om. Använd kolumnen sqlserver_start_time i sys.dm_os_sys_info för att hitta den senaste starttiden för databasmotorn. Databasadministratörer bör regelbundet göra säkerhetskopior av justeringsrekommenderingen om de vill behålla den efter serveråtervinning.

Fältet currentValue i state kolumnen kan ha följande värden:

Läge Description
Active Rekommendationen är aktiv och tillämpas inte ännu. Användaren kan använda rekommendationsskriptet och köra det manuellt.
Verifying Rekommendationen tillämpas av databasmotorn och den interna verifieringsprocessen jämför prestanda för den framtvingade planen med den regresserade planen.
Success Rekommendationen har tillämpats.
Reverted Rekommendationen återställs eftersom det inte finns några betydande prestandavinster.
Expired Rekommendationen har upphört att gälla och kan inte tillämpas längre.

JSON-dokumentet i state kolumnen innehåller orsaken till varför är rekommendationen i det aktuella tillståndet. Värden i orsaksfältet kan vara:

Reason Description
SchemaChanged Rekommendationen har upphört att gälla eftersom schemat för en refererad tabell har ändrats. En ny rekommendation skapas om en ny regression av frågeplan identifieras i det nya schemat.
StatisticsChanged Rekommendationen har upphört att gälla på grund av statistikändringen i en refererad tabell. En ny rekommendation skapas om en ny regression av frågeplan identifieras baserat på ny statistik.
ForcingFailed Det går inte att tvinga fram en rekommenderad plan för en fråga. Leta reda på last_force_failure_reason orsaken till felet i sys.query_store_plan-vyn .
AutomaticTuningOptionDisabled FORCE_LAST_GOOD_PLAN alternativet inaktiveras av användaren under verifieringsprocessen. Aktivera FORCE_LAST_GOOD_PLAN alternativet med alter database set AUTOMATIC_TUNING -instruktionen (Transact-SQL) eller framtvinga planen manuellt med hjälp av skriptet details i kolumnen.
UnsupportedStatementType Det går inte att tvinga planen på frågan. Exempel på frågor som inte stöds är markörer och INSERT BULK instruktioner.
LastGoodPlanForced Rekommendationen har tillämpats.
AutomaticTuningOptionNotEnabled Databasmotorn identifierade potentiell prestandaregression, men FORCE_LAST_GOOD_PLAN alternativet är inte aktiverat – se ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Använd rekommendationen manuellt eller aktivera FORCE_LAST_GOOD_PLAN alternativet.
VerificationAborted Verifieringsprocessen avbryts på grund av omstarten eller rensningen av Query Store.
VerificationForcedQueryRecompile Frågan kompileras om eftersom det inte finns någon betydande prestandaförbättring.
PlanForcedByUser Användaren tvingade planen manuellt med hjälp av proceduren sp_query_store_force_plan (Transact-SQL). Databasmotorn tillämpar inte rekommendationen om användaren uttryckligen bestämde sig för att tvinga fram en plan.
PlanUnforcedByUser Användaren avtvingade planen manuellt med hjälp av proceduren sp_query_store_unforce_plan (Transact-SQL). Eftersom användaren uttryckligen återställde den rekommenderade planen fortsätter databasmotorn att använda den aktuella planen och genererar en ny rekommendation om någon planregression inträffar i framtiden.
UserForcedDifferentPlan Användaren tvingade fram en annan plan manuellt med hjälp av proceduren sp_query_store_force_plan (Transact-SQL). Databasmotorn tillämpar inte rekommendationen om användaren uttryckligen bestämde sig för att tvinga fram en plan.
TempTableChanged En tillfällig tabell som användes i planen ändras.

Statistik i details kolumnen visar inte körningsplanstatistik (till exempel aktuell CPU-tid). Rekommendationsinformationen tas vid tidpunkten för regressionsidentifieringen och beskriver varför Databasmotorn identifierade prestandaregression. Använd regressedPlanId och recommendedPlanId för att fråga frågearkivkatalogvyer för att hitta exakt körningsplanstatistik.

Exempel på hur du använder information om justeringsrekommendationer

Exempel 1

Följande exempelkod hämtar det genererade Transact-SQL skriptet som tvingar fram en bra plan för en viss fråga:

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';

Exempel 2

Följande hämtar det genererade Transact-SQL skriptet som tvingar fram en bra plan för en viss fråga och ytterligare information om den uppskattade vinsten:

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;

Exempel 3

Följande hämtar det genererade Transact-SQL skriptet som tvingar fram en bra plan för en viss fråga och ytterligare information som innehåller frågetexten och frågeplaner som lagras i 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;

Mer information om JSON-funktioner som kan användas för att fråga efter värden i rekommendationsvyn finns i JSON-stöd i databasmotorn.

Permissions

Kräver VIEW SERVER STATE behörighet i SQL Server.

Kräver behörighet för VIEW DATABASE STATE databasen i Azure SQL Database.

Behörigheter för SQL Server 2022 och senare

Kräver VIEW SERVER PERFORMANCE STATE behörighet på servern.

Nästa steg