DMV: Memory Grants

Como monitorar queries que realizam alto consumo de memória?

(Comentário: existem várias formas de interpretar “consumo de memória”. Nesse artigo, falamos sobre o espaço de trabalho usado por uma query)

Use a view: sys.dm_exec_query_memory_grants

Exemplo:

 -- MEMORY GRANTS
SELECT 
mg.session_id, mg.request_id, mg.resource_semaphore_id, 
mg.query_cost, mg.dop, 
mg.used_memory_kb, mg.required_memory_kb, 
mg.requested_memory_kb, mg.granted_memory_kb, 
mg.max_used_memory_kb, mg.ideal_memory_kb, 
mg.request_time, mg.grant_time, 
mg.wait_time_ms, mg.timeout_sec, mg.queue_id, mg.wait_order, 
mg.plan_handle, mg.sql_handle, 
mg.group_id, mg.pool_id
FROM sys.dm_exec_query_memory_grants mg

 

Descrição:

  • session_id: Indica a sessão do usuário que está consumindo memória
  • query_cost: Custo estimado da query. Normalmente queries pesadas utilizam paralelismo de thread.
  • dop: Degree of Parallelism – número de threads que estão rodando para resolver a query
  • granted_memory_kb: Quantidade de memória usada no momento pela query
  • wait_time, queue_id: Tempo de espera na fila por mais “espaço de trabalho”, ou seja, memória
  • plan_handle, sql_handle: Identificadores da query e do plano de execução

 

Quando usar?

Esperas por RESOURCE_SEMAPHORE significam que as queries estão enfileirando por falta de memória disponível para o “espaço de trabalho”. Esse espaço de trabalho é usado como área temporária para comandos de SORT e HASH.