sys.dm_exec_query_memory_grants (Transact-SQL)
Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)
Gibt Informationen zu allen Abfragen zurück, die eine Speicherzuweisung angefordert haben und darauf warten oder eine Speicherzuweisung erhalten haben. Abfragen, die keine Speicherzuweisung erfordern, werden in dieser Ansicht nicht angezeigt. Beispielsweise verfügen Sortier- und Hashbeitrittsvorgänge über Speicherzuweisungen für die Abfrageausführung, während Abfragen ohne ORDER BY
Klausel keine Speicherzuweisung haben.
In Azure SQL Datenbank können dynamische Verwaltungsansichten keine Informationen verfügbar machen, die sich auf die Datenbankeinschluss auswirken, oder Informationen zu anderen Datenbanken, auf die der Benutzer Zugriff hat, verfügbar machen. Um diese Informationen nicht verfügbar zu machen, wird jede Zeile, die Daten enthält, die nicht zum verbundenen Mandanten gehören, herausgefiltert. Darüber hinaus werden die Werte in den Spalten scheduler_id
, wait_order
, gefiltert group_id
pool_id
. Der Spaltenwert ist auf NULL festgelegt.
Hinweis
Um dies über Azure Synapse Analytics oder Analytics Platform System (PDW) aufzurufen, verwenden Sie den Namen sys.dm_pdw_nodes_exec_query_memory_grants
. Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.
Spaltenname | Datentyp | Beschreibung |
---|---|---|
session_id | smallint | ID (SPID) der Sitzung, in der die Abfrage ausgeführt wird. |
request_id | int | ID der Anforderung. Ist im Kontext der Sitzung eindeutig. |
scheduler_id | int | ID des Zeitplanungsmoduls, der diese Abfrage plant. |
Dop | smallint | Grad an Parallelität für diese Abfrage. |
request_time | datetime | Datum und Uhrzeit, zu der die Abfrage die Arbeitsspeicherzuweisung angefordert hat. |
grant_time | datetime | Datum und Uhrzeit, zu der die Arbeitsspeicherzuweisung für die Abfrage erfolgt ist. NULL, wenn noch kein Arbeitsspeicher zugewiesen wurde. |
requested_memory_kb | bigint | Insgesamt angeforderter Arbeitsspeicher in Kilobytes. |
granted_memory_kb | bigint | Insgesamt tatsächlich zugewiesener Arbeitsspeicher in Kilobytes. Kann NULL sein, wenn noch kein Arbeitsspeicher zugewiesen wurde. In einer typischen Situation sollte dieser Wert mit identisch requested_memory_kb sein. Für die Indexerstellung wird möglicherweise vom Server bei Bedarf weiterer Arbeitsspeicher über den ursprünglich zugewiesenen hinaus zugelassen. |
required_memory_kb | bigint | Minimaler Arbeitsspeicher in Kilobyte, der erforderlich ist, um diese Abfrage auszuführen. requested_memory_kb ist gleich oder größer als dieser Betrag. |
used_memory_kb | bigint | Der zu diesem Zeitpunkt verwendete physische Arbeitsspeicher in Kilobytes. |
max_used_memory_kb | bigint | Der bis zu diesem Zeitpunkt verwendete maximale physische Arbeitsspeicher in Kilobytes. |
query_cost | float | Die geschätzten Abfragekosten. |
timeout_sec | int | Timeout in Sekunden, nach dem die Abfrage die Anforderung der Arbeitsspeicherzuweisung aufgibt. |
resource_semaphore_id | smallint | Nicht eindeutige ID des Ressourcensemaphors, auf das die Abfrage wartet. Hinweis: Diese ID ist in Versionen von SQL Server, die älter als SQL Server 2008 (10.0.x) sind, eindeutig. Diese Änderung kann die Abfrageausführung bei der Problembehandlung beeinflussen. Weitere Informationen finden Sie weiter unten in diesem Artikel im Abschnitt "Hinweise". |
queue_id | smallint | ID der Warteschlange, in der die Abfrage auf Arbeitsspeicherzuweisungen wartet. NULL, wenn der Arbeitsspeicher bereits zugewiesen wurde. |
wait_order | int | Sequenzielle Reihenfolge der wartenden Abfragen innerhalb des angegebenen queue_id . Dieser Wert kann sich für eine bestimmte Abfrage ändern, wenn andere Abfragen Speicherzuweisungen oder Timeouts erhalten. NULL, wenn bereits Arbeitsspeicher gewährt wurde. |
is_next_candidate | bit | Kandidat für die nächste Arbeitsspeicherzuweisung. 1 = Ja 0 = Nein NULL = Arbeitsspeicher wurde bereits zugewiesen |
wait_time_ms | bigint | Wartezeit in Millisekunden. NULL, wenn der Arbeitsspeicher bereits zugewiesen wurde. |
plan_handle | varbinary(64) | Bezeichner für diesen Abfrageplan. Verwenden Sie sys.dm_exec_query_plan , um den tatsächlichen XML-Plan zu extrahieren. |
sql_handle | varbinary(64) | Bezeichner für Transact-SQL-Text für diese Abfrage. Verwenden Sie sys.dm_exec_sql_text , um den tatsächlichen Transact-SQL-Text abzurufen. |
group_id | int | ID für die Arbeitsauslastungsgruppe, in der diese Abfrage ausgeführt wird. |
pool_id | int | ID des Ressourcenpools, zu dem die Arbeitsauslastungsgruppe gehört. |
is_small | tinyint | Der Wert 1 gibt an, dass diese Zuweisung das kleine Ressourcensemaphor verwendet. Der Wert 0 gibt an, dass ein normales Semaphor verwendet wird. |
ideal_memory_kb | bigint | Größe der Arbeitsspeicherzuweisung in Kilobyte (KB), um alles in den physischen Speicher aufzunehmen. Dieser Wert basiert auf der Kardinalitätsschätzung. |
pdw_node_id | int | Der Bezeichner für den Knoten, auf dem sich diese Verteilung befindet. Gilt für: Azure Synapse Analytics, Analytics Platform System (PDW) |
reserved_worker_count | bigint | Anzahl der reservierten Workerthreads. Gilt für: SQL Server (ab SQL Server 2016 (13.x)) und Azure SQL-Datenbank |
used_worker_count | bigint | Anzahl der Arbeitsthreads , die derzeit verwendet werden. Gilt für: SQL Server (ab SQL Server 2016 (13.x)) und Azure SQL-Datenbank |
max_used_worker_count | bigint | Maximale Anzahl von Workerthreads , die bis zu diesem Zeitpunkt verwendet wurden. Gilt für: SQL Server (ab SQL Server 2016 (13.x)) und Azure SQL-Datenbank |
reserved_node_bitmap | bigint | Bitmap von NUMA-Knoten, bei denen Workerthreads reserviert sind. Gilt für: SQL Server (ab SQL Server 2016 (13.x)) und Azure SQL-Datenbank |
Berechtigungen
Auf SQL Server ist die VIEW SERVER STATE
-Berechtigung erforderlich.
In Azure SQL-Datenbank ist die Berechtigung VIEW DATABASE STATE
in der Datenbank erforderlich.
Berechtigungen für SQL Server 2022 und höher
Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.
Bemerkungen
Abfragen, die dynamische Verwaltungssichten verwenden, die oder Aggregate enthalten ORDER BY
, können den Arbeitsspeicherverbrauch erhöhen und somit zur Problembehandlung beitragen.
Mit der Ressourcenkontrollen-Funktion kann ein Datenbankadministrator Serverressourcen auf Ressourcenpools verteilen, bis zu maximal 64 Pools. Ab SQL Server 2008 (10.0.x) verhält sich jeder Pool wie eine kleine unabhängige Serverinstanz und erfordert zwei Semaphore. Die Anzahl der Zeilen, die von sys.dm_exec_query_resource_semaphores
zurückgegeben werden, kann bis zu 20 Mal höher sein als die Zeilen, die in SQL Server 2005 (9.x) zurückgegeben werden.
Beispiele
Ein typisches Debugszenario für Abfragetimeouts kann Folgendes untersuchen:
Überprüfen Sie den Arbeitsspeicherstatus im Gesamtsystem mithilfe von sys.dm_os_memory_clerks, sys.dm_os_sys_info und verschiedenen Leistungsindikatoren.
Überprüfen Sie, ob Speicherreservierungen für die Abfrageausführung in vorhanden
sys.dm_os_memory_clerks
type = 'MEMORYCLERK_SQLQERESERVATIONS'
sind.Überprüfen Sie mithilfe von
sys.dm_exec_query_memory_grants
auf Abfragen, dieauf Zuweisungen 1 warten:--Find all queries waiting in the memory queue SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
1 In diesem Szenario ist der Wartetyp in der Regel RESOURCE_SEMAPHORE. Weitere Informationen finden Sie unter sys.dm_os_wait_stats (Transact-SQL).
Suchcache für Abfragen mit Arbeitsspeicherzuweisungen mithilfe von sys.dm_exec_cached_plans (Transact-SQL) und sys.dm_exec_query_plan (Transact-SQL)
-- retrieve every query plan from the plan cache USE master; GO SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle); GO
Wenn eine runaway-Abfrage vermutet wird, überprüfen Sie den Showplan in der
query_plan
Spalte aus sys.dm_exec_query_plan und den Abfragebatchtext
von sys.dm_exec_sql_text. Untersuchen Sie mithilfe von sys.dm_exec_requests speicherintensive Abfragen, die derzeit ausgeführt werden.--Active requests with memory grants SELECT --Session data s.[session_id], s.open_transaction_count --Memory usage , r.granted_query_memory, mg.grant_time, mg.requested_memory_kb, mg.granted_memory_kb, mg.required_memory_kb, mg.used_memory_kb, mg.max_used_memory_kb --Query , query_text = t.text, input_buffer = ib.event_info, query_plan_xml = qp.query_plan, request_row_count = r.row_count, session_row_count = s.row_count --Session history and status , s.last_request_start_time, s.last_request_end_time, s.reads, s.writes, s.logical_reads, session_status = s.[status], request_status = r.status --Session connection information , s.host_name, s.program_name, s.login_name, s.client_interface_name, s.is_user_process FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_requests AS r ON r.[session_id] = s.[session_id] LEFT OUTER JOIN sys.dm_exec_query_memory_grants AS mg ON mg.[session_id] = s.[session_id] OUTER APPLY sys.dm_exec_sql_text (r.[sql_handle]) AS t OUTER APPLY sys.dm_exec_input_buffer(s.[session_id], NULL) AS ib OUTER APPLY sys.dm_exec_query_plan (r.[plan_handle]) AS qp WHERE mg.granted_memory_kb > 0 ORDER BY mg.granted_memory_kb desc, mg.requested_memory_kb desc; GO
Weitere Informationen
- sys.dm_exec_query_resource_semaphores (Transact-SQL)
- sys.dm_os_wait_stats (Transact-SQL)
- Dynamische Verwaltungssichten und -funktionen im Zusammenhang mit der Ausführung (Transact-SQL)
- Handbuch zur Thread- und Taskarchitektur
- MSSQLSERVER_701
- Behandeln von Fehlern mit unzureichendem Arbeitsspeicher mit Azure SQL-Datenbanken
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für