Delen via


sys.dm_exec_query_memory_grants (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform Systeem (PDW)SQL-database in Microsoft Fabric

Geeft informatie terug over alle zoekopdrachten die een geheugenbeurs hebben aangevraagd en wachten op deze of die een geheugentoekenning hebben ontvangen. Queries die geen geheugentoekenning vereisen, zullen in deze weergave niet verschijnen. Bijvoorbeeld, sorteer- en hash-join-operaties hebben geheugentoekenningen voor query-uitvoering, terwijl queries zonder clausule ORDER BY geen geheugentoekenning krijgen.

In Azure SQL Database kunnen dynamische beheerweergaven geen informatie weergeven die van invloed is op databaseinsluiting of informatie weergeven over andere databases waartoe de gebruiker toegang heeft. Om te voorkomen dat deze informatie wordt blootgesteld, wordt elke rij die data bevat die niet bij de verbonden tenant hoort, eruit gefilterd. Daarnaast worden de waarden in de kolommen scheduler_id, wait_order, pool_id, group_id gefilterd; de kolomwaarde wordt ingesteld op NULL.

Opmerking

Gebruik de naam sys.dm_pdw_nodes_exec_query_memory_grantsom dit aan te roepen vanuit Azure Synapse Analytics of Analytics Platform System (PDW). Deze syntaxis wordt niet ondersteund door een serverloze SQL-pool in Azure Synapse Analytics.

Kolomnaam Gegevenstype Beschrijving
session_id smallint ID (SPID) van de sessie waarin deze query draait.
request_id int Id van de aanvraag. Uniek in de context van de sessie.
scheduler_id int ID van de planner die deze query plant.
Dop smallint Mate van parallelisme van deze vraag.
request_time datetime Datum en tijd waarop deze query de geheugentoekenning aanvroeg.
grant_time datetime Datum en tijd waarop geheugen voor deze vraag werd toegekend. NULL als geheugen nog niet is toegekend.
requested_memory_kb bigint Totale gevraagde hoeveelheid geheugen in kilobytes.
granted_memory_kb bigint Totale hoeveelheid geheugen die daadwerkelijk in kilobyte wordt toegekend. Kan NULL zijn als het geheugen nog niet is toegekend. Voor een typische situatie zou deze waarde hetzelfde moeten zijn als requested_memory_kb. Voor indexcreatie kan de server extra on-demand geheugen toestaan bovenop het aanvankelijk toegekende geheugen.
required_memory_kb bigint Minimaal geheugen nodig om deze query in kilobytes uit te voeren. requested_memory_kb gelijk of groter dan dit bedrag.
used_memory_kb bigint Fysiek geheugen dat op dit moment in kilobytes wordt gebruikt.
max_used_memory_kb bigint Maximaal fysiek geheugen tot nu toe in kilobytes.
query_cost float Geschatte querykosten.
timeout_sec int Time-out binnen enkele seconden voordat deze query het verzoek om geheugentoestemming opgeeft.
resource_semaphore_id smallint Niet-unieke ID van de resourcesemafoor waarop deze query wacht.

Notitie: Deze ID is uniek in versies van SQL Server die ouder zijn dan SQL Server 2008 (10.0.x). Deze wijziging kan de uitvoering van probleemoplossing beïnvloeden. Voor meer informatie, zie de sectie "Opmerkingen" later in dit artikel.
queue_id smallint ID van de wachtrij waar deze query wacht op geheugenverleeningen. NULL als het geheugen al is toegekend.
wait_order int Sequentiële volgorde van wachtopdrachten binnen de gespecificeerde queue_id. Deze waarde kan veranderen voor een bepaalde query als andere zoekopdrachten geheugenbeurzen of time-out krijgen. NULL als geheugen al is toegekend.
is_next_candidate bit Kandidaat voor de volgende geheugenbeurs.

1 = Ja

0 = Nee

NULL = Geheugen is al toegekend.
wait_time_ms bigint Wachttijd in milliseconden. NULL als het geheugen al is toegekend.
plan_handle varbinary(64) Identificatie voor dit queryplan. Gebruik sys.dm_exec_query_plan om het daadwerkelijke XML-plan te extraheren.
sql_handle varbinary(64) Identifier voor Transact-SQL tekst voor deze zoekopdracht. Vroeger sys.dm_exec_sql_text kreeg je de echte Transact-SQL sms.
group_id int ID voor de werklastgroep waar deze query draait.
pool_id int ID van de resource pool waartoe deze workloadgroep behoort.
is_small tinyint Wanneer ingesteld op 1, geeft dit aan dat deze toekenning de kleine resource semaphore gebruikt. Wanneer ingesteld op 0, geeft dit aan dat een reguliere semafoor wordt gebruikt.
ideal_memory_kb bigint De grootte, in kilobytes (KB), van het geheugen geeft om alles in fysiek geheugen te passen. Dit is gebaseerd op de kardinaliteitsschatting.
pdw_node_id int De id voor het knooppunt waarop deze distributie zich bevindt.

van toepassing op: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint Aantal gereserveerde worker-threads.

Van toepassing op: SQL Server (beginnend met SQL Server 2016 (13.x)) en Azure SQL Database
used_worker_count bigint Aantal werkdraden dat op dit moment wordt gebruikt.

Van toepassing op: SQL Server (beginnend met SQL Server 2016 (13.x)) en Azure SQL Database
max_used_worker_count bigint Maximaal aantal werkdraden tot nu toe gebruikt.

Van toepassing op: SQL Server (beginnend met SQL Server 2016 (13.x)) en Azure SQL Database
reserved_node_bitmap bigint Bitmap van NUMA-knooppunten waar workerthreads zijn gereserveerd.

Van toepassing op: SQL Server (beginnend met SQL Server 2016 (13.x)) en Azure SQL Database

Permissions

Op SQL Server is toestemming vereist VIEW SERVER STATE .
In Azure SQL Database is de VIEW DATABASE STATE toestemming in de database vereist.

Machtigingen voor SQL Server 2022 en hoger

Vereist de machtiging PRESTATIESTATUS VAN DE WEERGAVESERVER op de server.

Opmerkingen

Queries die dynamische beheerweergaven gebruiken die bevatten of aggregaties bevatten ORDER BY , kunnen het geheugenverbruik verhogen en zo bijdragen aan het probleem dat ze aan het oplossen zijn.

De functie Resource Governor stelt een databasebeheerder in staat om serverbronnen te verdelen over resource pools, tot maximaal 64 pools. Vanaf SQL Server 2008 (10.0.x) gedraagt elke pool zich als een kleine, onafhankelijke serverinstantie en vereist twee semaforen. Het aantal rijen dat wordt teruggegeven kan sys.dm_exec_query_resource_semaphores tot 20 keer hoger zijn dan de rijen die worden teruggegeven in SQL Server 2005 (9.x).

Voorbeelden

Een typisch debuggingscenario voor query-time-out kan het volgende onderzoeken:

  • Controleer de algemene status van het systeemgeheugen met behulp van sys.dm_os_memory_clerks, sys.dm_os_sys_info en diverse prestatietellers.

  • Controleer op geheugenreserveringen voor query-uitvoering in sys.dm_os_memory_clerks waar type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Controleer op aanvragen die1 wachten voor subsidies met 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 In dit scenario is het wachttype doorgaans RESOURCE_SEMAPHORE. Voor meer informatie, zie sys.dm_os_wait_stats (Transact-SQL).

  • Zoek in de cache naar zoekopdrachten met geheugentoekenningen met sys.dm_exec_cached_plans (Transact-SQL) ensys.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  
    
  • Als er een ongecontroleerde query wordt vermoed, bekijk dan de Showplan in de query_plan kolom van sys.dm_exec_query_plan en de querybatch text van sys.dm_exec_sql_text. Onderzoek vervolgens geheugenintensieve zoekopdrachten die momenteel worden uitgevoerd, met behulp van 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
    

Zie ook