sys.dm_exec_query_memory_grants (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Returnerar information om alla frågor som har begärt och väntar på ett minnesbidrag eller har fått ett minnesbidrag. Frågor som inte kräver minnesbidrag kommer inte att visas i denna vy. Till exempel har sorterings- och hash-join-operationer minnesbeviljande för frågeexekvering, medan frågor utan ORDER BY klausul inte har minnesbeviljaning.

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 denna information filtreras varje rad som innehåller data som inte tillhör den anslutna tenanten bort. Dessutom filtreras värdena i kolumnerna scheduler_id, wait_order, pool_id, ; group_id kolumnvärdet sätts till NULL.

Anmärkning

Om du vill anropa detta från Azure Synapse Analytics eller Analytics Platform System (PDW) använder du namnet sys.dm_pdw_nodes_exec_query_memory_grants. Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.

Kolumnnamn Datatyp Beskrivning
session_id smallint ID (SPID) för sessionen där denna fråga körs.
request_id int ID för begäran. Unikt i kontexten för sessionen.
scheduler_id int ID för schemaläggaren som schemalägger denna fråga.
Dop smallint Graden av parallellism i denna fråga.
request_time datetime Datum och tid då denna fråga begärde minnesbeviljningen.
grant_time datetime Datum och tid då minne beviljades för denna fråga. NULL om minnet ännu inte är beviljat.
requested_memory_kb bigint Total begärd mängd minne i kilobyte.
granted_memory_kb bigint Total mängd minne som faktiskt ges i kilobyte. Kan vara NULL om minnet ännu inte är beviljat. För en typisk situation bör detta värde vara detsamma som requested_memory_kb. För indexskapande kan servern tillåta ytterligare minne på begäran utöver det ursprungliga minnet.
required_memory_kb bigint Minsta minne krävs för att köra denna fråga i kilobyte. requested_memory_kb är samma eller större än denna summa.
used_memory_kb bigint Fysiskt minne används just nu i kilobyte.
max_used_memory_kb bigint Maximalt fysiskt minne som används fram till detta ögonblick i kilobyte.
query_cost float Uppskattad kostnad för förfrågningar.
timeout_sec int Timeout sekunder innan denna fråga ger minnesbeviljningsbegäran.
resource_semaphore_id smallint Icke-unikt ID för resurssemaforen som denna fråga väntar på.

Not: Detta ID är unikt i versioner av SQL Server som är äldre än SQL Server 2008 (10.0.x). Denna förändring kan påverka felsökningskörningen av frågor. För mer information, se avsnittet "Anmärkningar" senare i denna artikel.
queue_id smallint ID för väntekön där denna fråga väntar på minnesbeviljade. NULL om minnet redan är beviljat.
wait_order int Sekventiell ordning av väntefrågor inom den angivna queue_id. Detta värde kan ändras för en given fråga om andra frågor får minnesbeviljande eller tidsavbruten tid. NULL om minnet redan är beviljat.
is_next_candidate bit Kandidat för nästa minnesbidrag.

1 = Ja

0 = Nej

NULL = Minne är redan beviljat.
wait_time_ms bigint Väntetid i millisekunder. NULL om minnet redan är beviljat.
plan_handle varbinary(64) Identifierare för denna frågeplan. Använd sys.dm_exec_query_plan för att extrahera själva XML-planen.
sql_handle varbinary(64) Identifierare för Transact-SQL text för denna fråga. Fick sys.dm_exec_sql_text den riktiga Transact-SQL texten.
group_id int ID för arbetsbelastningsgruppen där denna fråga körs.
pool_id int ID för resurspoolen som denna arbetsbelastningsgrupp tillhör.
is_small tinyint När den sätts till 1 indikerar detta bidrag att den lilla resurssemaforen används. När den sätts till 0 indikerar den att en reguljär semafor används.
ideal_memory_kb bigint Storleken, i kilobyte (KB), av minnet ger utrymme för att få plats med allt i det fysiska minnet. Detta baseras på kardinalitetsuppskattningen.
pdw_node_id int Identifieraren för noden som den här fördelningen är på.

gäller för: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint Antal trådar för reserverade arbetare.

Gäller för: SQL Server (från och med SQL Server 2016 (13.x)) och Azure SQL Database
used_worker_count bigint Antal arbetstrådar som används just nu.

Gäller för: SQL Server (från och med SQL Server 2016 (13.x)) och Azure SQL Database
max_used_worker_count bigint Maximalt antal arbetstrådar som används hittills.

Gäller för: SQL Server (från och med SQL Server 2016 (13.x)) och Azure SQL Database
reserved_node_bitmap bigint Bitmap över NUMA-noder där arbetstrådar är reserverade.

Gäller för: SQL Server (från och med SQL Server 2016 (13.x)) och Azure SQL Database

Permissions

På SQL Server krävs VIEW SERVER STATE tillstånd.
På Azure SQL Database krävs behörighet VIEW DATABASE STATE i databasen.

Behörigheter för SQL Server 2022 och senare

Kräver BEHÖRIGHET FÖR VISNINGSSERVERNS PRESTANDATILLSTÅND på servern.

Anmärkningar

Frågor som använder dynamiska hanteringsvyer som inkluderar ORDER BY eller aggregerar kan öka minnesförbrukningen och därmed bidra till det problem de felsöker.

Funktionen Resource Governor gör det möjligt för en databasadministratör att fördela serverresurser mellan resurspooler, upp till maximalt 64 pooler. Från och med SQL Server 2008 (10.0.x) beter sig varje pool som en liten oberoende serverinstans och kräver två semaforer. Antalet rader som returneras från sys.dm_exec_query_resource_semaphores kan vara upp till 20 gånger fler än raderna som returneras i SQL Server 2005 (9.x).

Examples

Ett typiskt felsökningsscenario för frågetimeout kan undersöka följande:

  • Kontrollera den övergripande statusen för systemminnet med hjälp av sys.dm_os_memory_clerks,sys.dm_os_sys_info och olika prestandaräknare.

  • Kontrollera om minnesreservationer för frågeexekvering finns där sys.dm_os_memory_clerkstype = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Kontrollera om frågor som väntar1 för bidrag med hjälp av:sys.dm_exec_query_memory_grants

    --Find all queries waiting in the memory queue  
    SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
    

    1 I detta scenario är väntetypen vanligtvis RESOURCE_SEMAPHORE. För mer information, se sys.dm_os_wait_stats (Transact-SQL).

  • Sök i cachen efter frågor med minnesbeviljande med sys.dm_exec_cached_plans (Transact-SQL) och 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  
    
  • Om en okontrollerad sökning misstänks, undersök Showplanen i kolumnen query_plan från sys.dm_exec_query_plan och frågebatchen text från sys.dm_exec_sql_text. Undersök dessutom minnesintensiva frågor som för närvarande körs, med hjälp av sys.dm_exec_requests.

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

Se även