sys.dm_exec_query_stats (Transact-SQL)
Gibt die zusammengefasste Leistungsstatistik für zwischengespeicherte Abfragepläne in SQL Server zurück. Diese Sicht enthält eine Zeile pro Abfrageanweisung innerhalb des zwischengespeicherten Plans, und die Lebensdauer der Zeilen ist an den Plan selbst gebunden. Wenn ein Plan aus dem Cache entfernt wird, werden die entsprechenden Zeilen aus dieser Sicht entfernt.
Hinweis
Die erste Abfrage von sys.dm_exec_query_stats kann zu ungenauen Ergebnissen führen, wenn derzeit eine hohe Arbeitsauslastung auf dem Server besteht. Erneutes Ausführen der Abfrage liefert unter Umständen genauere Ergebnisse.
Gilt für: SQL Server (SQL Server 2008 bis zur aktuellen Version), Azure SQL-Datenbank. |
Spaltenname |
Datentyp |
Beschreibung |
---|---|---|
sql_handle |
varbinary(64) |
Ein Token, das auf den Batch oder die gespeicherte Prozedur verweist, dem bzw. der die Abfrage angehört. sql_handle kann zusammen mit statement_start_offset und statement_end_offset verwendet werden, um den SQL-Text der Abfrage abzurufen, indem die dynamische Verwaltungsfunktion sys.dm_exec_sql_text aufgerufen wird. |
statement_start_offset |
int |
Gibt die Startposition der Abfrage, die in der Zeile beschrieben wird, beginnend mit 0 im Text des zugehörigen persistenten Objekts oder Batchobjekts an (in Bytes). |
statement_end_offset |
int |
Gibt die Endposition der Abfrage, die in der Zeile beschrieben wird, beginnend mit 0 im Text des zugehörigen persistenten Objekts oder Batchobjekts an (in Bytes). Bei Versionen vor SQL Server 2014 gibt der Wert -1 das Ende des Batches an. Nachfolgende Kommentare sind nicht mehr enthalten. |
plan_generation_num |
bigint |
Eine Sequenznummer, anhand der nach einer Neukompilierung zwischen einzelnen Instanzen von Plänen unterschieden werden kann. |
plan_handle |
varbinary(64) |
Ein Token, das auf den kompilierten Plan verweist, dem die Abfrage angehört. Dieser Wert kann an die dynamische Verwaltungsfunktion sys.dm_exec_query_plan übergeben werden, um den Abfrageplan abzurufen. Ist immer 0x000, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
creation_time |
datetime |
Der Zeitpunkt, zu dem der Plan kompiliert wurde. |
last_execution_time |
datetime |
Der Zeitpunkt, zu dem die Ausführung des Plans zuletzt gestartet wurde. |
execution_count |
bigint |
Die Anzahl von Planausführungen seit der letzten Kompilierung. |
total_worker_time |
bigint |
Die CPU-Gesamtzeit in Mikrosekunden (aber nur auf Millisekunden genau) für Ausführungen dieses Plans seit der Kompilierung. Wenn zahlreiche Ausführungen weniger als 1 Millisekunde dauern, wird total_worker_time bei systemintern kompilierten gespeicherten Prozeduren u. U. nicht exakt angegeben. |
last_worker_time |
bigint |
Die CPU-Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für die letzte Ausführung des Plans.1 |
min_worker_time |
bigint |
Die minimale CPU-Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine einzelne Ausführung dieses Plans.1 |
max_worker_time |
bigint |
Maximale CPU-Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine einzelne Ausführung dieses Plans.1 |
total_physical_reads |
bigint |
Die Gesamtanzahl physischer Lesevorgänge für Ausführungen dieses Plans seit der Kompilierung. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
last_physical_reads |
bigint |
Die Anzahl physischer Lesevorgänge bei der letzten Ausführung des Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
min_physical_reads |
bigint |
Die bisherige minimale Anzahl physischer Lesevorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
max_physical_reads |
bigint |
Die bisherige maximale Anzahl physischer Lesevorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
total_logical_writes |
bigint |
Die Gesamtanzahl logischer Schreibvorgänge für Ausführungen dieses Plans seit der Kompilierung. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
last_logical_writes |
bigint |
Die Anzahl der Pufferpoolseiten, die seit der letzten Planausführung modifiziert wurden. Wenn eine Seite bereits modifiziert (geändert) wurde, werden keine Schreibvorgänge gezählt. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
min_logical_writes |
bigint |
Die bisherige minimale Anzahl logischer Schreibvorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
max_logical_writes |
bigint |
Die bisherige maximale Anzahl logischer Schreibvorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
total_logical_reads |
bigint |
Die Gesamtanzahl logischer Lesevorgänge für Ausführungen dieses Plans seit der Kompilierung. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
last_logical_reads |
bigint |
Die Anzahl logischer Lesevorgänge bei der letzten Ausführung des Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
min_logical_reads |
bigint |
Die bisherige minimale Anzahl logischer Lesevorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
max_logical_reads |
bigint |
Die bisherige maximale Anzahl logischer Lesevorgänge für eine einzelne Ausführung dieses Plans. Ist immer 0, wenn eine speicheroptimierte Tabelle abgefragt wird. |
total_clr_time |
bigint |
Zeit in Mikrosekunden (aber nur auf Millisekunden genau) in Microsoft.NET Framework CLR-Objekten (Common Language Runtime) für Ausführungen dieses Plans seit der Kompilierung. Die CLR-Objekte können gespeicherte Prozeduren, Funktionen, Trigger, Typen und Aggregate sein. |
last_clr_time |
bigint |
Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für die Ausführung in .NET Framework CLR-Objekten während der letzten Ausführung dieses Plans. Die CLR-Objekte können gespeicherte Prozeduren, Funktionen, Trigger, Typen und Aggregate sein. |
min_clr_time |
bigint |
Minimale Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine einzelne Ausführung dieses Plans in .NET Framework CLR-Objekten. Die CLR-Objekte können gespeicherte Prozeduren, Funktionen, Trigger, Typen und Aggregate sein. |
max_clr_time |
bigint |
Maximale Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine einzelne Ausführung dieses Plans in .NET Framework CLR. Die CLR-Objekte können gespeicherte Prozeduren, Funktionen, Trigger, Typen und Aggregate sein. |
total_elapsed_time |
bigint |
Insgesamt verstrichene Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für abgeschlossene Ausführungen dieses Plans. |
last_elapsed_time |
bigint |
Verstrichene Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für die letzte abgeschlossene Ausführung dieses Plans. |
min_elapsed_time |
bigint |
Mindestens verstrichene Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine beliebige abgeschlossene Ausführung dieses Plans. |
max_elapsed_time |
bigint |
Maximal verstrichene Zeit in Mikrosekunden (aber nur auf Millisekunden genau) für eine beliebige abgeschlossene Ausführung dieses Plans. |
query_hash |
Binary(8) |
Binärer Hashwert, der in der Abfrage berechnet wird und zum Identifizieren von Abfragen mit ähnlicher Logik verwendet wird. Sie können den Abfragehash verwenden, um die aggregierte Ressourcennutzung für Abfragen zu ermitteln, die sich nur durch Literalwerte unterscheiden. |
query_plan_hash |
binary(8) |
Binärer Hashwert, der im Abfrageausführungsplan wird und zum Identifizieren ähnlicher Abfrageausführungspläne verwendet wird. Sie können diesen Abfrageplan-Hashwert verwenden, um die kumulierten Kosten für Abfragen mit ähnlichen Ausführungsplänen zu suchen. Ist immer 0x000, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
total_rows |
bigint |
Die Gesamtanzahl der von der Abfrage zurückgegebenen Zeilen. Darf nicht NULL sein. Ist immer 0, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
last_rows |
bigint |
Die Anzahl der bei der letzten Ausführung der Abfrage zurückgegebenen Zeilen. Darf nicht NULL sein. Ist immer 0, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
min_rows |
bigint |
Die minimale Anzahl der von der Abfrage zurückgegebenen Zeilen bei den Planausführungen seit der letzten Kompilierung. Darf nicht NULL sein. Ist immer 0, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
max_rows |
bigint |
Die maximale Anzahl der von der Abfrage zurückgegebenen Zeilen bei den Planausführungen seit der letzten Kompilierung. Darf nicht NULL sein. Ist immer 0, wenn eine systemintern kompilierte gespeicherte Prozedur eine speicheroptimierte Tabelle abfragt. |
statement_sql_handle |
varbinary(64) |
Gilt für: SQL Server 2014 bis SQL Server 2014. Zur künftigen Verwendung reserviert. |
statement_context_id |
bigint |
Gilt für: SQL Server 2014 bis SQL Server 2014. Zur künftigen Verwendung reserviert. |
1 Wenn die Statistiksammlung für systemintern kompilierte gespeicherte Prozeduren aktiviert ist, wird worker_time in Millisekunden erfasst. Wird die Abfrage in weniger als einer Millisekunde ausgeführt, lautet der Wert 0.
Berechtigungen
Erfordert die VIEW SERVER STATE-Berechtigung auf dem Server.
Hinweise
Statistiken in der Sicht werden nach Abschluss einer Abfrage aktualisiert.
Beispiele
A. Suchen der TOP-N-Abfragen
Das folgende Beispiel gibt Informationen zu den fünf Abfragen mit dem höchsten durchschnittlichen CPU-Zeitaufwand zurück. Die Abfragen werden in diesem Beispiel anhand des Abfragehashes aggregiert, sodass logisch identische Abfragen basierend auf dem kumulierten Ressourcenverbrauch gruppiert werden.
USE AdventureWorks2012; GO SELECT TOP 5 query_stats.query_hash AS "Query Hash", SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time", MIN(query_stats.statement_text) AS "Statement Text" FROM (SELECT QS.*, SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(ST.text) ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1) AS statement_text FROM sys.dm_exec_query_stats AS QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats GROUP BY query_stats.query_hash ORDER BY 2 DESC;
B. Zurückgeben der aggregierten Zeilenanzahlen für eine Abfrage
Im folgenden Beispiel werden Informationen zu aggregierten Zeilenanzahlen (Gesamtanzahl der Zeilen, minimale Anzahl der Zeilen, maximale Anzahl der Zeilen und letzte Zeilen) für Abfragen zurückgegeben.
SELECT qs.execution_count, SUBSTRING(qt.text,qs.statement_start_offset/2 +1, (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2 ELSE qs.statement_end_offset end - qs.statement_start_offset )/2 ) AS query_text, qt.dbid, dbname= DB_NAME (qt.dbid), qt.objectid, qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE qt.text like '%SELECT%' ORDER BY qs.execution_count DESC;
Siehe auch
Dynamische Verwaltungssichten und Funktionen (Transact-SQL)
Dynamische Verwaltungssichten und -funktionen im Zusammenhang mit der Ausführung (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)