## Kedy použiť Pri čakaní `RESOURCE_SEMAPHORE` alebo timeoutoch veľkých reportov. ## Ako čítať výsledok `grant_time IS NULL` = request ešte na grant čaká (sú zoradené hore). Porovnaj `requested_mb` s `peak_used_mb` – veľký rozdiel znamená nadhodnotený odhad. > [!WARNING] > Čakajúci grant nemusí znamenať málo RAM – častejšie ide o zlé odhady kardinality, plán alebo súbeh viacerých veľkých dotazov. **Oprávnenia:** `VIEW SERVER STATE` (na SQL Server 2022 stačí aj `VIEW SERVER PERFORMANCE STATE`). **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Pamäť SQL Servera a OS](script.php?id=24&s=pamat-sql-servera-a-os-rychly-prehlad)
Skript
Memory grants – kto čaká na pamäť (RESOURCE_SEMAPHORE)
Requesty, ktoré majú alebo čakajú na query memory grant (sort, hash): žiadaná, pridelená a reálne použitá pamäť.
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Memory grants – kto čaká na pamäť (RESOURCE_SEMAPHORE)
Účel: Requesty, ktoré majú alebo čakajú na query memory grant (sort, hash): žiadaná, pridelená a reálne použitá pamäť.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
SELECT g.session_id, g.request_id, DB_NAME(r.database_id) AS database_name,
g.request_time, g.grant_time, g.wait_time_ms,
CAST(g.requested_memory_kb / 1024.0 AS decimal(18,1)) AS requested_mb,
CAST(g.granted_memory_kb / 1024.0 AS decimal(18,1)) AS granted_mb,
CAST(g.used_memory_kb / 1024.0 AS decimal(18,1)) AS used_mb,
CAST(g.max_used_memory_kb / 1024.0 AS decimal(18,1)) AS peak_used_mb,
g.dop, s.login_name, s.program_name,
t.text AS sql_batch
FROM sys.dm_exec_query_memory_grants AS g
LEFT JOIN sys.dm_exec_sessions AS s ON s.session_id = g.session_id
LEFT JOIN sys.dm_exec_requests AS r
ON r.session_id = g.session_id AND r.request_id = g.request_id
OUTER APPLY sys.dm_exec_sql_text(g.sql_handle) AS t
ORDER BY CASE WHEN g.grant_time IS NULL THEN 0 ELSE 1 END,
g.requested_memory_kb DESC;