Sdílet prostřednictvím


sys.dm_exec_query_memory_grants (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Vrací informace o všech dotazech, které požádaly o schválení vzpomínky nebo na něj čekají, nebo jim bylo uděleno. Dotazy, které nevyžadují přidělení paměti, se v tomto zobrazení neobjeví. Například operace třídění a hashování spojů mají paměťové granty pro provádění dotazů, zatímco dotazy bez klauzule ORDER BY nebudou mít paměťové granty.

V Azure SQL Database nemůžou zobrazení dynamické správy zveřejnit informace, které by ovlivnily zahrnutí databáze nebo zpřístupňují informace o jiných databázích, ke kterým má uživatel přístup. Aby se předešlo vystavení těchto informací, je filtrován každý řádek obsahující data, která nepatří připojenému tenantovi. Navíc jsou filtrovány hodnoty ve sloupcích scheduler_id, wait_order, pool_id, group_id ; hodnota sloupce je nastavena na NULL.

Poznámka:

Pokud to chcete volat ze služby Azure Synapse Analytics nebo systému PDW (Analytics Platform System), použijte název sys.dm_pdw_nodes_exec_query_memory_grants. Tato syntaxe není podporována bezserverovým fondem SQL ve službě Azure Synapse Analytics.

Název sloupce Datový typ Description
session_id smallint ID (SPID) relace, ve které tento dotaz běží.
request_id int ID požadavku. Jedinečné v kontextu relace.
scheduler_id int ID plánovače, který tento dotaz plánuje.
Kameraman smallint Stupeň paralelismu tohoto dotazu.
request_time datetime Datum a čas, kdy tento dotaz požadoval povolení k pamětí.
grant_time datetime Datum a čas, kdy byla pro tento dotaz udělena paměť. NULL, pokud paměť ještě není udělena.
requested_memory_kb bigint Celkové požadované množství paměti v kilobajtech.
granted_memory_kb bigint Celkové množství paměti skutečně udělené v kilobajtech. Může být NULL, pokud paměť ještě není udělena. Pro typickou situaci by tato hodnota měla být stejná jako requested_memory_kb. Pro tvorbu indexů může server povolit další paměť na vyžádání nad rámec původně udělené paměti.
required_memory_kb bigint Minimální paměť potřebná k provedení tohoto dotazu je v kilobajtech. requested_memory_kb je stejné nebo větší než tato částka.
used_memory_kb bigint Fyzická paměť se v tuto chvíli používá v kilobajtech.
max_used_memory_kb bigint Maximální fyzická paměť použitá do tohoto okamžiku v kilobajtech.
query_cost float Odhadované náklady na dotazy.
timeout_sec int Vyprší časový limit během několika sekund, než tento dotaz vydá žádost o povolení k pamětí.
resource_semaphore_id smallint Neunikátní ID semaforu zdroje, na kterém tento dotaz čeká.

Poznámka: Toto ID je unikátní u verzí SQL Serveru, které jsou starší než SQL Server 2008 (10.0.x). Tato změna může ovlivnit řešení řešení problémů při provádění dotazů. Pro více informací viz sekce "Poznámky" později v tomto článku.
queue_id smallint ID čekací fronty, kde tento dotaz čeká na přidělení paměti. NULL, pokud je paměť již udělena.
wait_order int Postupné pořadí čekání dotazů v rámci specifikované queue_id. Tato hodnota se může změnit pro daný dotaz, pokud jiné dotazy dostanou povolení nebo časový limit. NULL, pokud už je paměť udělena.
is_next_candidate bit Kandidát na další paměťový grant.

1 = Ano

0 = Ne

NULL = Paměť je již udělena.
wait_time_ms bigint Čekací doba v milisekundách. NULL, pokud je paměť již udělena.
plan_handle varbinary(64) Identifikátor tohoto plánu dotazu. Použijte sys.dm_exec_query_plan k extrakci skutečného XML plánu.
sql_handle varbinary(64) Identifikátor pro Transact-SQL text pro tento dotaz. Použijte sys.dm_exec_sql_text to k získání skutečného Transact-SQL textu.
group_id int ID pro skupinu zátěží, kde tento dotaz běží.
pool_id int ID zdrojového fondu, do kterého tato skupina zátěží patří.
is_small tinyint Když je nastaveno na 1, označuje, že tento grant využívá semafor s malými zdroji. Při nastavení na 0 označuje, že je použit běžný semafor.
ideal_memory_kb bigint Velikost paměti, v kilobajtech (KB), umožňuje vešt vše do fyzické paměti. To je založeno na odhadu kardinálnosti.
pdw_node_id int Identifikátor uzlu, na který je tato distribuce zapnutá.

Platí na: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint Počet vyhrazených pracovních vláken.

Platí na: SQL Server (počínaje SQL Server 2016 (13.x)) a Azure SQL Database
used_worker_count bigint Počet pracovních vláken použitých v tuto chvíli.

Platí na: SQL Server (počínaje SQL Server 2016 (13.x)) a Azure SQL Database
max_used_worker_count bigint Maximální počet pracovních vláken použitých do tohoto okamžiku.

Platí na: SQL Server (počínaje SQL Server 2016 (13.x)) a Azure SQL Database
reserved_node_bitmap bigint Bitmapa uzlů NUMA, kde jsou vyhrazena pracovní vlákna .

Platí na: SQL Server (počínaje SQL Server 2016 (13.x)) a Azure SQL Database

Povolení

Na SQL Serveru je VIEW SERVER STATE potřeba povolení.
V Azure SQL databázi vyžaduje oprávnění VIEW DATABASE STATE v databázi.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje oprávnění ZOBRAZIT STAV VÝKONU SERVERU na serveru.

Poznámky

Dotazy, které používají dynamické pohledy na správu zahrnující ORDER BY nebo agregované, mohou zvýšit spotřebu paměti a tím přispět k problému, který řeší.

Funkce Resource Govern umožňuje správce databáze rozdělit serverové zdroje mezi zdrojové pooly, až do maxima 64 poolů. Od SQL Server 2008 (10.0.x) se každý pool chová jako malá nezávislá serverová instance a vyžaduje dva semafory. Počet řádků, které se sys.dm_exec_query_resource_semaphores vracejí, může být až 20krát větší než počet řádků vrácených v SQL Server 2005 (9.x).

Examples

Typický ladicí scénář pro vypršení času dotazu může zkoumat následující:

  • Zkontrolujte celkový stav systémové paměťi pomocí sys.dm_os_memory_clerks, sys.dm_os_sys_info a různých výkonových čítačů.

  • Zkontrolujte rezervace paměti pro dotazy a vykonání v místě sys.dm_os_memory_clerks , kde type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Zkontrolujte dotazy čekající1 na granty pomocí 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 V tomto scénáři je typ čekání obvykle RESOURCE_SEMAPHORE. Pro více informací viz sys.dm_os_wait_stats (Transact-SQL).

  • Vyhledávejte cache pro dotazy s přidělováním pamětí pomocí sys.dm_exec_cached_plans (Transact-SQL) a 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  
    
  • Pokud je podezření na nekontrolovaný dotaz, prohledejte Showplan ve sloupci query_planz sys.dm_exec_query_plan a dotazovací dávku text z sys.dm_exec_sql_text. Dále prozkoumejte paměťově náročné dotazy, které se právě provádějí, pomocí 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
    

Viz také