Teilen über


sys.query_store_plan (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics

Enthält Informationen zu jedem Ausführungsplan, der einer Abfrage zugeordnet ist.

Spaltenname Datentyp BESCHREIBUNG
plan_id bigint Der Primärschlüssel.
query_id bigint Fremdschlüssel. Wird mit sys.query_store_query (Transact-SQL) verknüpft.
plan_group_id bigint ID der Plangruppe. Cursorabfragen erfordern in der Regel mehrere Pläne (füllen und abrufen). Füll- und Abrufpläne, die zusammen kompiliert werden, befinden sich in derselben Gruppe.

0 bedeutet, dass der Plan nicht in einer Gruppe enthalten ist.
engine_version nvarchar(32) Version des Moduls, das zum Kompilieren des Plans im <major>.<minor>.<build>.<revision> Format verwendet wird.
compatibility_level smallint Datenbankkompatibilitäts-Ebene der Datenbank, auf die in der Abfrage verwiesen wird.
query_plan_hash binary(8) MD5-Hash des einzelnen Plans.
query_plan nvarchar(max) Showplan-XML für den Abfrageplan.
is_online_index_plan bit Der Plan wurde während eines Onlineindexbuilds verwendet.

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
is_trivial_plan bit Der Plan ist ein trivialer Plan (Ausgabe in Stufe 0 des Abfrageoptimierers).

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
is_parallel_plan bit Der Plan ist parallel.

Hinweis: Azure Synapse Analytics gibt immer zurück 1.
is_forced_plan bit Der Plan wird als erzwungen markiert, wenn der Benutzer die gespeicherte Prozedur sys.sp_query_store_force_planausführt. Der Erzwingungsmechanismus garantiert nicht, dass dieser genaue Plan für die Abfrage verwendet wird, auf query_iddie verwiesen wird. Das Erzwingen von Erzwingen führt dazu, dass die Abfrage erneut kompiliert wird, und in der Regel wird genau derselbe oder ein ähnlicher Plan für den Plan erzeugt, auf den verwiesen wird plan_id. Wenn das Erzwingen des Plans nicht erfolgreich ist, force_failure_count wird inkrementiert und last_force_failure_reason mit dem Fehlergrund aufgefüllt.

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
is_natively_compiled bit Der Plan enthält nativ kompilierte speicheroptimierte Prozeduren. (0 = FALSE, 1 = TRUE).

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
force_failure_count bigint Gibt an, wie oft beim Erzwingen dieses Plans ein Fehler aufgetreten ist. Der Wert kann nur inkrementiert werden, wenn die Abfrage neu kompiliert wird (nicht bei jeder Ausführung). Setzt auf 0 jedes Mal zurück, wenn is_plan_forced von FALSE zu TRUE.

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
last_force_failure_reason int Grund, warum beim Erzwingen des Plans ein Fehler auftrat.

0: Kein Fehler, andernfalls Nummer des Fehlers, der das Erzwingen verhindert hat.
3617: COMPILATION_ABORTED_BY_CLIENT
8637: ONLINE_INDEX_BUILD
8675: OPTIMIZATION_REPLAY_FAILED
8683: INVALID_STARJOIN
8684: TIME_OUT
8689: NO_DB
8690: HINT_CONFLICT
8691: SETOPT_CONFLICT
8694: DQ_NO_FORCING_SUPPORTED
8698: NO_PLAN
8712: NO_INDEX
8713: VIEW_COMPILE_FAILED
<anderer Wert>: GENERAL_FAILURE

Hinweis: Azure Synapse Analytics gibt immer zurück 0.
last_force_failure_reason_desc nvarchar(128) Textbeschreibung von last_force_failure_reason.

COMPILATION_ABORTED_BY_CLIENT: Clientabbruch der Abfragekompilierung vor Abschluss
ONLINE_INDEX_BUILD: Abfrage versucht, Daten zu ändern, während die Zieltabelle über einen Index verfügt, der online erstellt wird
OPTIMIZATION_REPLAY_FAILED: Fehler beim Ausführen des Skripts für die Replay-Wiedergabe der Optimierung.
INVALID_STARJOIN: Plan enthält ungültige StarJoin-Spezifikation
TIME_OUT: Optimierer hat die Anzahl der zulässigen Vorgänge überschritten, während sie nach einem Plan suchen, der durch erzwungenen Plan angegeben wurde.
NO_DB: Eine im Plan angegebene Datenbank ist nicht vorhanden.
HINT_CONFLICT: Abfrage kann nicht kompiliert werden, da der Plan mit einem Abfragehinweis in Konflikt liegt.
DQ_NO_FORCING_SUPPORTED: Abfrage kann nicht ausgeführt werden, da der Plan mit der Verwendung von verteilten Abfrage- oder Volltextvorgängen in Konflikt stand.
NO_PLAN: Der Abfrageprozessor konnte keinen Abfrageplan erstellen, da der erzwungene Plan nicht als gültig für die Abfrage überprüft werden konnte.
NO_INDEX: Index, der im Plan angegeben ist, ist nicht mehr vorhanden
VIEW_COMPILE_FAILED: Der Abfrageplan konnte aufgrund eines Problems in einer indizierten Ansicht, auf die im Plan verwiesen wird, nicht erzwungen werden.
GENERAL_FAILURE: allgemeiner Erzwingungsfehler (nicht mit anderen Gründen abgedeckt)

Hinweis: Azure Synapse Analytics gibt immer zurück NONE.
count_compiles bigint Planen der Kompilierungsstatistiken.
initial_compile_start_time datetimeoffset Planen der Kompilierungsstatistiken.
last_compile_start_time datetimeoffset Planen der Kompilierungsstatistiken.
last_execution_time datetimeoffset Die letzte Ausführungszeit bezieht sich auf die letzte Endzeit der Abfrage/des Plans.
avg_compile_duration float Planen von Kompilierungsstatistiken in Mikrosekunden. Dividieren Sie durch 1.000.000 Sekunden, um Sekunden zu erhalten.
last_compile_duration bigint Planen von Kompilierungsstatistiken in Mikrosekunden. Dividieren Sie durch 1.000.000 Sekunden, um Sekunden zu erhalten.
plan_forcing_type int Gilt für: SQL Server 2017 (14.x) und höhere Versionen

Planerzwingungstyp.

0: NONE
1: MANUAL
2: AUTO
plan_forcing_type_desc nvarchar(60) Gilt für: SQL Server 2017 (14.x) und höhere Versionen

Textbeschreibung von plan_forcing_type.

NONE: Kein Plan erzwingen
MANUAL: Planen, der vom Benutzer erzwungen wird
AUTO: Planen Sie durch automatische Optimierung erzwungen.
has_compile_replay_script bit Gilt für: SQL Server 2022 (16.x) und höhere Versionen

Gibt an, ob der Plan über ein Optimierungsskript verfügt, das dem Skript zugeordnet ist:
0 = Kein Optimierungswiedergabeskript (keines oder sogar ein ungültiges).
1 = Optimierungswiedergabeskript aufgezeichnet.

Gilt nicht für Azure Synapse Analytics.
is_optimized_plan_forcing_disabled bit Gilt für: SQL Server 2022 (16.x) und höhere Versionen

Gibt an, ob die optimierte Planerzwingung für den Plan deaktiviert wurde:
0 = deaktiviert.
1 = nicht deaktiviert

Gilt nicht für Azure Synapse Analytics.
plan_type int Gilt für: SQL Server 2022 (16.x) und höhere Versionen

Plantyp.
0: Kompilierter Plan
1: Verteilerplan
2: Abfragevariantenplan

Gilt nicht für Azure Synapse Analytics.
plan_type_desc nvarchar(120) Gilt für: SQL Server 2022 (16.x) und höhere Versionen

Textbeschreibung des Plantyps.
Kompilierter Plan: Gibt an, dass es sich bei dem Plan um einen nicht parametrischen vertraulichen Plan handelt, der für einen optimierten Plan optimiert ist.
Dispatcher Plan: Gibt an, dass der Plan ein parameterbezogener optimierter Verteilerplan ist.
Abfragevariantenplan: Gibt an, dass der Plan ein parameterbezogener, optimierter Abfragevariantenplan ist.

Gilt nicht für Azure Synapse Analytics.

Hinweise

Mehrere Pläne können erzwungen werden, wenn Abfragespeicher für sekundäre Replikate aktiviert ist.

In Azure Synapse Analytics führt die Verwendung von Spalten has_compile_replay_script, is_optimized_plan_forcing_disabled, plan_type, zu einem Invalid Column Name Fehler, plan_type_desc da sie nicht unterstützt werden. Ein Beispiel für die Verwendung sys.query_store_plan in Azure Synapse Analytics finden Sie unter Beispiel B.

Einschränkungen des Erzwingens von Plänen

Der Abfragedatenspeicher verfügt über eine Mechanismus, der den Abfrageoptimierer dazu zwingen kann, einen bestimmten Ausführungsplan zu verwenden. Es gibt allerdings Einschränkungen, die dazu führen können, dass das Erzwingen eines Plans verhindert wird.

Erstens, wenn der Plan die folgenden Konstruktionen enthält:

  • Massen-Anweisung einfügen
  • einen Verweis auf eine externe Tabelle
  • eine verteilte Abfrage oder Volltextvorgänge
  • Verwendung von elastischen Abfragen
  • Dynamische oder Keysetcursor
  • eine ungültige Sternverknüpfungsspezifikation

Hinweis

Azure SQL-Datenbank und SQL Server 2019 und neueren Buildversionen unterstützen das Erzwingen von statischen und schnellen Vorwärtscursorn.

Zweitens, wenn Objekte, die der Plan verwendet, nicht mehr zur Verfügung stehen:

  • Datenbank (wenn datenbank, wo der Plan stammt, ist nicht mehr vorhanden)
  • ein Index (nicht mehr vorhanden oder deaktiviert)

Und drittens, bei Problemen mit dem Plan selbst:

  • Er darf nicht abgefragt werden.
  • Der Abfrageoptimierer hat die Zahl an zulässigen Vorgängen überschritten.
  • Die XML des Plans ist ungültig formuliert.

Berechtigungen

Erfordert die VIEW DATABASE STATE-Berechtigung.

Beispiele

A. Ermitteln des Grunds, warum SQL Server einen Plan über QDS nicht erzwingen konnte

Achten Sie auf die last_force_failure_reason_desc und force_failure_count die Spalten:

SELECT TOP 1000
    p.query_id,
    p.plan_id,
    p.last_force_failure_reason_desc,
    p.force_failure_count,
    p.last_compile_start_time,
    p.last_execution_time,
    q.last_bind_duration,
    q.query_parameterization_type_desc,
    q.context_settings_id,
    c.set_options,
    c.STATUS
FROM sys.query_store_plan p
INNER JOIN sys.query_store_query q
    ON p.query_id = q.query_id
INNER JOIN sys.query_context_settings c
    ON c.context_settings_id = q.context_settings_id
LEFT JOIN sys.query_store_query_text t
    ON q.query_text_id = t.query_text_id
WHERE p.is_forced_plan = 1
    AND p.last_force_failure_reason != 0;

B. Abfrage zum Anzeigen von Abfrageplanergebnissen in Azure Synapse Analytics

Verwenden Sie die folgende Beispielabfrage, um die 100 neuesten Ausführungspläne im Abfragespeicher in Azure Synapse Analytics zu finden.

SELECT TOP 100
    plan_id,
    query_id,
    plan_group_id,
    engine_version,
    compatibility_level,
    query_plan_hash,
    query_plan,
    is_online_index_plan,
    is_trivial_plan,
    is_parallel_plan,
    is_forced_plan,
    is_natively_compiled,
    force_failure_count,
    last_force_failure_reason,
    last_force_failure_reason_desc,
    count_compiles,
    initial_compile_start_time,
    last_compile_start_time,
    last_execution_time,
    avg_compile_duration,
    last_compile_duration,
    plan_forcing_type,
    plan_forcing_type_desc
FROM sys.query_store_plan
ORDER BY last_execution_time DESC;