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.