Megosztás a következőn keresztül:


sys.dm_exec_query_memory_grants (Transact-SQL)

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

Visszaadja az összes olyan lekérdezést, amely memóriatámogatást kért és vár, vagy kapott memóriatámogatást. Azok a lekérdezések, amelyek nem igényelnek memóriatámogatást, nem jelennek meg ebben a nézetben. Például a sort és hash join műveletek memóriát biztosítanak a lekérdezés végrehajtásához, míg a klauzula ORDER BY nélküli lekérdezéseknek nem lesz memória megadása.

Az Azure SQL Database-ben a dinamikus felügyeleti nézetek nem tehetnek közzé olyan információkat, amelyek hatással lennének az adatbázis-elszigetelésre, vagy nem tehetnek közzé információkat más olyan adatbázisokról, amelyekhez a felhasználó hozzáfér. Ennek az információnak a feltárása érdekében minden olyan sor, amely nem a kapcsolódó bérlőhöz tartozó adatokat tartalmaz, kiszűrik. Ezen felül az oszlopok scheduler_idértékei , wait_order, pool_idgroup_id szűrve vannak; az oszlop értéke NULL-ra van állítva.

Megjegyzés:

Ha ezt az Azure Synapse Analytics vagy az Analytics Platform System (PDW) szolgáltatásból szeretné meghívni, használja a nevet sys.dm_pdw_nodes_exec_query_memory_grants. Ezt a szintaxist az Azure Synapse Analytics kiszolgáló nélküli SQL-készlete nem támogatja.

Oszlop neve Adattípus Leírás
session_id smallint Az ülés azonosítója (SPID), ahol ez a lekérdezés fut.
request_id int A kérés azonosítója. A munkamenet kontextusában egyedi.
scheduler_id int Az ütemező azonosítója, amely ezt a lekérdezést ütemezi.
Dop smallint A lekérdezés párhuzamosságának mértéke.
request_time datetime A keresés időpontja és dátuma, amikor ez a lekérdezés memória támogatást kért.
grant_time datetime Dátum és időpont, amikor memóriát adtak erre a lekérdezésre. NULL, ha még nem kapta meg a memóriát.
requested_memory_kb bigint A kért memória teljes mennyisége kilobájtokban.
granted_memory_kb bigint A tényleges memória teljes mennyisége kilobájtokban. Lehet NULL, ha a memóriát még nem adták meg. Egy tipikus helyzetben ennek az értéknek ugyanaznak kell lennie, mint requested_memory_kb. Az indexkészítéshez a szerver további igény szerinti memóriát engedélyezhet az eredetileg biztosított memórián túl.
required_memory_kb bigint A lekérdezés futtatásához szükséges minimum memória kilobájtokban. requested_memory_kb ugyanaz vagy nagyobb, mint ez az összeg.
used_memory_kb bigint Fizikai memória ebben a pillanatban kilobájtokban használatos.
max_used_memory_kb bigint A maximális fizikai memória eddig kilobájtokban van felhasználva.
query_cost float Becsült lekérdezési költség.
timeout_sec int Másodpercek múlva időkorlát, mielőtt ez a lekérdezés megadja a memória engedélykérést.
resource_semaphore_id smallint Nem egyedi azonosítója annak az erőforrás-szemafúrnak, amelyre ez a lekérdezés vár.

Jegyzet: Ez az azonosító egyedi az SQL Server verzióiban, amelyek korábban állnak az SQL Server 2008-nál (10.0.x). Ez a változás befolyásolhatja a lekérdezés elvégzésének hibakeresését. További információért lásd a cikk későbbi "Megjegyzések" szakaszát.
queue_id smallint A várakozó sor azonosítója, ahol ez a lekérdezés memória támogatásokra vár. NULL, ha a memória már megadva.
wait_order int A megvárakozó lekérdezések sorrendje a megadott queue_idkereten belül. Ez az érték változhat egy adott lekérdezés esetén, ha más lekérdezések memória támogatást vagy időkorlátot kapnak. NULL, ha memória már engedélyezett.
is_next_candidate bit Jelölt a következő memóriatámogatásra.

1 = Igen

0 = Nem

NULL = Memória már engedélyezett.
wait_time_ms bigint Várakozási idő ezredmásodpercekben. NULL, ha a memória már megadva.
plan_handle varbinary(64) Ennek a lekérdezési tervnek azonosítója. Használd sys.dm_exec_query_plan az XML csomag kihúzására.
sql_handle varbinary(64) Azonosító Transact-SQL szöveghez ehhez a lekérdezéshez. Használtam sys.dm_exec_sql_text a tényleges Transact-SQL szöveget kaptam.
group_id int ID annak a munkaterhelési csoportnak, ahol ez a lekérdezés fut.
pool_id int Az erőforrás-pool azonosítója, amelyhez ez a munkaterhelési csoport tartozik.
is_small tinyint Ha 1-re állítva állítjuk, az azt jelzi, hogy ez a támogatás a kis erőforrás szemafórt használja. Ha 0-ra állítják, azt jelzi, hogy egy reguláris szemafórt használnak.
ideal_memory_kb bigint A memória összege, kilobájtokban (KB), amely mindent beilleszt a fizikai memóriába. Ez a kardinalitás-becslés alapján alapul.
pdw_node_id int Annak a csomópontnak az azonosítója, amelyen ez a disztribúció található.

A következővonatkozik: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint A fenntartott munkás szálak száma.

Érvényes: SQL Server (SQL Server 2016 (13.x)-től kezdve) és Azure SQL Database
used_worker_count bigint Jelenleg használt munkafonalok száma.

Érvényes: SQL Server (SQL Server 2016 (13.x)-től kezdve) és Azure SQL Database
max_used_worker_count bigint A lehető legtöbb munkafonal eddig felhasznált.

Érvényes: SQL Server (SQL Server 2016 (13.x)-től kezdve) és Azure SQL Database
reserved_node_bitmap bigint Bitmapet a NUMA csomópontokról, ahol a munkavezető szálak vannak fenntartva.

Érvényes: SQL Server (SQL Server 2016 (13.x)-től kezdve) és Azure SQL Database

Permissions

SQL Serveren engedély szükséges VIEW SERVER STATE .
Azure SQL Database-en az adatbázisban szükséges engedély VIEW DATABASE STATE .

Engedélyek az SQL Server 2022-hez és újabb verziókhoz

A KISZOLGÁLÓ TELJESÍTMÉNYÁLLAPOTÁNAK MEGTEKINTÉSE engedélyre van szükség a kiszolgálón.

Megjegyzések

Azok a lekérdezések, amelyek dinamikus menedzsment nézeteket használnak, amelyek tartalmazzák ORDER BY vagy aggregálnak, növelhetik a memóriafogyasztást, és így hozzájárulhatnak a probléma megoldásához.

A Resource Governor funkció lehetővé teszi az adatbázis-adminisztrátor számára, hogy szerver erőforrásait oszlassa meg az erőforrás-poolok között, legfeljebb 64 pool között. Az SQL Server 2008-tól (10.0.x) kezdve minden pool úgy viselkedik, mint egy kis, független szerver példány, és két szemafórt igényel. A visszaküldött sorok sys.dm_exec_query_resource_semaphores száma akár 20-szor is nagyobb lehet, mint az SQL Server 2005 (9.x) által visszaadott sorok.

Példák

Egy tipikus hibakeresési idő-kilépés esetén a következőket vizsgálhatja:

  • Ellenőrizze az általános rendszer memória állapotát sys.dm_os_memory_clerks, sys.dm_os_sys_info és különböző teljesítményszámlálókkal is.

  • Ellenőrizze a lekérdezés-végrehajtási memóriafenntartásokat a helyen sys.dm_os_memory_clerks , ahol type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Nézd meg az1-re váró pályázatokat a következő módon: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 Ebben a helyzetben a várakozási típus általában RESOURCE_SEMAPHORE. További információért lásd sys.dm_os_wait_stats (Transact-SQL).

  • Cache-ben keressen memóriatámogatással rendelkező lekérdezéseket sys.dm_exec_cached_plans (Transact-SQL) és sys.dm_exec_query_plan (Transact-SQL) használatával

    -- 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  
    
  • Ha gyanítják a szökős lekérdezést, nézd meg a Showplan-t az query_planoszlopban sys.dm_exec_query_plan-ből , és lekérdezési kötetet texta sys.dm_exec_sql_text-ből. Vizsgáljuk meg a jelenleg futó memóriaigényes lekérdezéseket sys.dm_exec_requests használatával.

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

Lásd még