Freigeben über


sys.dm_db_tuning_recommendations (Transact-SQL)

Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-Datenbank Azure SQL Managed Instance

Gibt detaillierte Informationen zu Empfehlungen zur automatischen Optimierung zurück. Weitere Informationen finden Sie unter "Automatische Optimierung"

Weitere Informationen finden Sie unter Überwachung und Leistungsoptimierung in Azure SQL-Datenbank und Azure SQL verwaltete Instanz.

In Azure SQL-Datenbank können dynamische Verwaltungsansichten keine Informationen verfügbar machen, die sich auf das Eindämmen von Datenbanken auswirken oder Informationen zu anderen Datenbanken verfügbar machen, auf die der Benutzer zugreifen kann. Um zu vermeiden, dass diese Informationen verfügbar gemacht werden, wird jede Zeile mit Daten, die zum verbundenen Mandanten gehören, herausgefiltert.

Spaltenname Datentyp Beschreibung
name nvarchar(4000) Eindeutiger Name der Empfehlung.
type nvarchar(4000) Der Name der Option für die automatische Optimierung, die die Empfehlung erzeugt hat, z. B. FORCE_LAST_GOOD_PLAN
Grund nvarchar(4000) Grund dafür, warum diese Empfehlung vorgelegt wurde.
valid_since datetime2 Das erste Mal, wenn diese Empfehlung generiert wurde.
last_refresh datetime2 Das letzte Mal, wenn diese Empfehlung generiert wurde.
state nvarchar(4000) JSON-Dokument, das den Status der Empfehlung beschreibt. Folgende Felder sind verfügbar:
- currentValue - aktueller Stand der Empfehlung.
- reason - Konstante, die beschreibt, warum sich die Empfehlung im aktuellen Zustand befindet.
is_executable_action bit 1 = Die Empfehlung kann über Transact-SQL-Skript für die Datenbank ausgeführt werden.
0 = Die Empfehlung kann nicht für die Datenbank ausgeführt werden (z. B. Informationen nur oder empfehlungsverwendet)
is_revertable_action bit 1 = Die Empfehlung kann automatisch überwacht und vom Datenbankmodul zurückgesetzt werden.
0 = Die Empfehlung kann nicht automatisch überwacht und wiederhergestellt werden. Die meisten ausführbaren Aktionen können wiederhergestellt werden.
execute_action_start_time datetime2 Das Datum, an dem die Empfehlung angewendet wird.
execute_action_duration time Dauer der Ausführungsaktion.
execute_action_initiated_by nvarchar(4000) User = Manuell erzwungener Plan in der Empfehlung.
System = Automatisch angewendete Systemempfehlung.
execute_action_initiated_time datetime2 Datum der Anwendung der Empfehlung.
revert_action_start_time datetime2 Datum, an dem die Empfehlung wiederhergestellt wurde.
revert_action_duration time Dauer der Wiederherstellen-Aktion.
revert_action_initiated_by nvarchar(4000) User = Manuell nicht erzwungener empfohlener Plan.
System = Die Empfehlung des Systems wird automatisch wiederhergestellt.
revert_action_initiated_time datetime2 Datum, an dem die Empfehlung wiederhergestellt wurde.
score int Geschätzter Wert/Effekt für diese Empfehlung im Maßstab 0-100 (je größer)
details nvarchar(max) JSON-Dokument, das weitere Details zur Empfehlung enthält. Folgende Felder sind verfügbar:

planForceDetails
- queryId - query_id der zurückgeschrittenen Abfrage.
- regressedPlanId - plan_id des zurückgeschrittenen Plans.
- regressedPlanExecutionCount – Anzahl der Ausführungen der Abfrage mit zurückgeschrittenen Plan, bevor die Regression erkannt wird.
- regressedPlanAbortedCount - Anzahl der erkannten Fehler während der Ausführung des zurückgeschrittenen Plans.
- regressedPlanCpuTimeAverage - Durchschnittliche CPU-Zeit (in Mikro sekunden), die von der regressierten Abfrage verbraucht wird, bevor die Regression erkannt wird.
- regressedPlanCpuTimeStddev – Die Standardabweichung der CPU-Zeit, die von der regressierten Abfrage verbraucht wird, bevor die Regression erkannt wird.
- recommendedPlanId - plan_id des Plans, der erzwungen werden sollte.
- recommendedPlanExecutionCount– Anzahl der Ausführungen der Abfrage mit dem Plan, der erzwungen werden soll, bevor die Regression erkannt wird.
- recommendedPlanAbortedCount - Anzahl der erkannten Fehler während der Ausführung des Plans, die erzwungen werden sollen.
- recommendedPlanCpuTimeAverage - Durchschnittliche CPU-Zeit (in Mikro sekunden), die von der Abfrage verbraucht wird, die mit dem Plan ausgeführt wird, der erzwungen werden soll (berechnet, bevor die Regression erkannt wird).
- recommendedPlanCpuTimeStddev Standardabweichung der CPU-Zeit, die von der regressierten Abfrage verbraucht wird, bevor die Regression erkannt wird.

implementationDetails
- method - Die Methode, die verwendet werden soll, um die Regression zu korrigieren. Der Wert lautet stets TSql.
- script – Transact-SQL-Skript, das ausgeführt werden soll, um den empfohlenen Plan zu erzwingen.

Hinweise

Zurückgegebene sys.dm_db_tuning_recommendations Informationen werden aktualisiert, wenn das Datenbankmodul potenzielle Abfrageleistungsregression identifiziert und nicht beibehalten wird. Empfehlungen werden nur beibehalten, bis das Datenbankmodul neu gestartet wird. Verwenden Sie die sqlserver_start_time-Spalte in sys.dm_os_sys_info, um die aktuellste Startzeit der Datenbank-Engine zu suchen. Datenbankadministratoren sollten regelmäßig Sicherungskopien der Optimierungsempfehlung erstellen, wenn sie sie nach dem Recycling des Servers beibehalten möchten.

Das currentValue Feld in der state Spalte hat möglicherweise die folgenden Werte:

Status Beschreibung
Active Empfehlung ist aktiv und wird noch nicht angewendet. Der Benutzer kann das Empfehlungsskript übernehmen und manuell ausführen.
Verifying Empfehlung wird durch Datenbank-Engine und interner Überprüfungsprozess angewendet, wobei die Leistung des erzwungenen Plans mit dem zurückgesetzten Plan verglichen wird.
Success Empfehlung wird erfolgreich angewendet.
Reverted Empfehlung wird wiederhergestellt, da keine signifikanten Leistungsgewinne erzielt werden.
Expired Empfehlung ist abgelaufen und kann nicht mehr angewendet werden.

Das JSON-Dokument in state Spalte enthält den Grund, warum die Empfehlung im aktuellen Zustand beschrieben wird. Werte im Grundfeld können folgendes sein:

Ursache Beschreibung
SchemaChanged Empfehlung ist abgelaufen, da das Schema einer referenzierten Tabelle geändert wird. Neue Empfehlung wird erstellt, wenn eine neue Abfrageplanregression im neuen Schema erkannt wird.
StatisticsChanged Die Empfehlung ist aufgrund der Statistikänderung in einer referenzierten Tabelle abgelaufen. Neue Empfehlung wird erstellt, wenn eine neue Abfrageplanregression basierend auf neuen Statistiken erkannt wird.
ForcingFailed Empfohlener Plan kann nicht für eine Abfrage erzwungen werden. Suchen Sie die last_force_failure_reason in der sys.query_store_plan Ansicht, um den Grund des Fehlers zu finden.
AutomaticTuningOptionDisabled FORCE_LAST_GOOD_PLAN option is disabled by the user during verification process. Aktivieren Sie FORCE_LAST_GOOD_PLAN option using ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) statement, or force the plan manually using the script in the details column.
UnsupportedStatementType Der Plan kann für die Abfrage nicht erzwungen werden. Beispiele für nicht unterstützte Abfragen sind Cursor und INSERT BULK Anweisungen.
LastGoodPlanForced Empfehlung wird erfolgreich angewendet.
AutomaticTuningOptionNotEnabled Datenbank-Engine identifizierte potenzielle Leistungsregression, aber die FORCE_LAST_GOOD_PLAN Option ist nicht aktiviert – siehe ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Empfehlung manuell anwenden oder Option aktivieren FORCE_LAST_GOOD_PLAN .
VerificationAborted Der Überprüfungsprozess wird aufgrund des Neustarts oder Abfragespeicher Bereinigung abgebrochen.
VerificationForcedQueryRecompile Die Abfrage wird neu kompiliert, da es keine erhebliche Leistungsverbesserung gibt.
PlanForcedByUser Der Benutzer hat den Plan manuell mit sp_query_store_force_plan (Transact-SQL) -Prozedur erzwungen. Das Datenbankmodul wird die Empfehlung nicht anwenden, wenn der Benutzer explizit beschlossen hat, einen Plan zu erzwingen.
PlanUnforcedByUser Der Benutzer hat den Plan manuell mit sp_query_store_unforce_plan (Transact-SQL) -Verfahren entforcet. Da der Benutzer den empfohlenen Plan explizit zurückgesetzt hat, verwendet das Datenbankmodul weiterhin den aktuellen Plan und generiert eine neue Empfehlung, wenn eine Planregression in Zukunft auftritt.
UserForcedDifferentPlan Der Benutzer hat manuell einen anderen Plan mit sp_query_store_force_plan (Transact-SQL) -Verfahren erzwungen. Das Datenbankmodul wird die Empfehlung nicht anwenden, wenn der Benutzer explizit beschlossen hat, einen Plan zu erzwingen.
TempTableChanged Eine temporäre Tabelle, die im Plan verwendet wurde, wird geändert.

Statistiken in der details Spalte zeigen keine Laufzeitplanstatistiken an (z. B. aktuelle CPU-Zeit). Die Empfehlungsdetails werden zum Zeitpunkt der Regressionserkennung verwendet und beschreiben, warum Datenbank-Engine identifizierte Leistungsregression ermittelt wurde. Verwenden Und recommendedPlanId abfragen Sie regressedPlanId Abfragespeicher Katalogansichten, um genaue Laufzeitplanstatistiken zu finden.

Beispiele für die Verwendung von Optimierungsempfehlungen

Beispiel 1

Der folgende Beispielcode ruft das generierte Transact-SQL-Skript ab, das einen guten Plan für eine bestimmte Abfrage erzwingt:

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

Beispiel 2

Im Folgenden wird das generierte Transact-SQL-Skript aufgerufen, das einen guten Plan für eine bestimmte Abfrage und zusätzliche Informationen über den geschätzten Gewinn erzwingt:

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;

Beispiel 3

Im Folgenden wird das generierte Transact-SQL-Skript aufgerufen, das einen guten Plan für jede bestimmte Abfrage und zusätzliche Informationen erzwingt, die den Abfragetext und die in Abfragespeicher gespeicherten Abfragepläne enthalten:

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;

Weitere Informationen zu JSON-Funktionen, die zum Abfragen von Werten in der Empfehlungsansicht verwendet werden können, finden Sie unter JSON-Unterstützung in Datenbank-Engine.

Berechtigungen

Erfordert VIEW SERVER STATE berechtigungen in SQL Server.

Erfordert die VIEW DATABASE STATE Berechtigung für die Datenbank in Azure SQL-Datenbank.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.

Nächste Schritte