Partilhar via


sys.dm_exec_query_memory_grants (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

Retorna informações sobre todas as consultas que solicitaram e estão aguardando uma concessão de memória ou receberam uma concessão de memória. As consultas que não exigem uma concessão de memória não aparecerão nessa exibição. Por exemplo, as operações de classificação e junção de hash têm concessões de memória para execução de consulta, enquanto consultas sem uma ORDER BY cláusula não terão uma concessão de memória.

No Banco de Dados SQL do Azure, as exibições de gerenciamento dinâmico não podem expor informações que afetariam a contenção do banco de dados ou expor informações sobre outros bancos de dados aos quais o usuário tem acesso. Para evitar expor essas informações, todas as linhas que contêm dados que não pertencem ao locatário conectado são filtradas. Além disso, os valores nas colunas scheduler_id, wait_order, pool_id, group_id são filtrados; o valor da coluna é definido como NULL.

Observação

Para chamar isso do Azure Synapse Analytics ou do PDW (Analytics Platform System), use o nome sys.dm_pdw_nodes_exec_query_memory_grants. Não há suporte a essa sintaxe para o pool de SQL sem servidor no Azure Synapse Analytics.

Nome da coluna Data type Descrição
session_id smallint ID (SPID) da sessão em que esta consulta está em execução.
request_id int ID da solicitação. Exclusiva no contexto da sessão.
scheduler_id int ID do agendador que está programando esta consulta.
DOP smallint Grau de paralelismo desta consulta.
request_time datetime Data e hora quando esta consulta solicitou a concessão de memória.
grant_time datetime Data e hora quando a memória foi concedida a esta consulta. NULL se memória ainda não tiver sido concedida.
requested_memory_kb bigint Quantidade total solicitada de memória em quilobytes.
granted_memory_kb bigint Total de memória realmente concedido em quilobytes. Poderá ser NULL se a memória ainda não tiver sido concedida. Para uma situação típica, esse valor deve ser o mesmo que requested_memory_kb. Na criação de índices, o servidor pode permitir memória sob demanda adicional além da memória inicialmente concedida.
required_memory_kb bigint Memória mínima exigida para executar esta consulta em quilobytes. requested_memory_kb é igual ou maior que esse valor.
used_memory_kb bigint Memória física usada neste momento em quilobytes.
max_used_memory_kb bigint Máximo de memória física usada até este momento em quilobytes.
query_cost float Custo de consulta estimado.
timeout_sec int Tempo limite em segundos antes de esta consulta desistir da solicitação de concessão de memória.
resource_semaphore_id smallint ID não exclusivo do semáforo do recurso no qual esta consulta está aguardando.

Observação: essa ID é exclusiva em versões do SQL Server anteriores ao SQL Server 2008 (10.0.x). Essa alteração pode afetar a execução de consulta de solução de problemas. Para obter mais informações, consulte a seção "Comentários" mais adiante neste artigo.
queue_id smallint ID da fila de espera em que esta consulta aguarda concessões de memória. NULL se a memória já tiver sido concedida.
wait_order int Ordem sequencial de consultas em espera dentro do .queue_id Esse valor pode ser alterado para uma determinada consulta se outras consultas obtiverem concessões de memória ou tempo limite. NULL se a memória já tiver sido concedida.
is_next_candidate bit Candidato para a próxima concessão de memória.

1 = Sim

0 = Não

NULL = Se a memória já tiver sido concedida.
wait_time_ms bigint Tempo de espera em milissegundos. NULL se a memória já tiver sido concedida.
plan_handle varbinary(64) Identificador para este plano de consulta. Use sys.dm_exec_query_plan para extrair o plano XML real.
sql_handle varbinary(64) Identificador para texto Transact-SQL para esta consulta. Use sys.dm_exec_sql_text para obter o texto Transact-SQL real.
group_id int ID do grupo de carga de trabalho em que esta consulta está sendo executada.
pool_id int ID do pool de recursos a que este grupo de carga de trabalho pertence.
is_small tinyint Quando definido como 1, indica que esta concessão usa o sinal do recurso pequeno. Quando definido como 0, indica que um sinal normal é usado.
ideal_memory_kb bigint Tamanho, em quilobytes (KB), da concessão de memória para ajustar tudo na memória física. Ele tem como base a estimativa de cardinalidade.
pdw_node_id int O identificador do nó em que essa distribuição está ativada.

Aplica-se a: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint Número de threads de trabalho reservados.

Aplica-se a: SQL Server (Começando pelo SQL Server 2016 (13.x)) e Banco de Dados SQL do Azure
used_worker_count bigint Número de threads de trabalho usados neste momento.

Aplica-se a: SQL Server (Começando pelo SQL Server 2016 (13.x)) e Banco de Dados SQL do Azure
max_used_worker_count bigint Número máximo de threads de trabalho usados até o momento.

Aplica-se a: SQL Server (Começando pelo SQL Server 2016 (13.x)) e Banco de Dados SQL do Azure
reserved_node_bitmap bigint Bitmap de nós NUMA em que os threads de trabalho são reservados.

Aplica-se a: SQL Server (Começando pelo SQL Server 2016 (13.x)) e Banco de Dados SQL do Azure

Permissões

No SQL Server, requer a permissão VIEW SERVER STATE.
No Banco de Dados SQL do Azure, requer a permissão VIEW DATABASE STATE no banco de dados.

Permissões do SQL Server 2022 e posteriores

É necessária a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Comentários

As consultas que usam exibições de gerenciamento dinâmico que incluem ORDER BY ou agregam podem aumentar o consumo de memória e, portanto, contribuir para o problema que estão solucionando.

O recurso Administrador de Recursos permite que um administrador de banco de dados distribua recursos de servidor entre pools de recursos, até um máximo de 64 pools. A partir do SQL Server 2008 (10.0.x), cada pool se comporta como uma pequena instância de servidor independente e requer dois semáforos. O número de linhas retornadas pode sys.dm_exec_query_resource_semaphores ser até 20 vezes maior do que as linhas retornadas no SQL Server 2005 (9.x).

Exemplos

Um cenário de depuração típico para o tempo limite da consulta pode investigar o seguinte:

  • Verifique o status geral da memória do sistema usando sys.dm_os_memory_clerks, sys.dm_os_sys_info e vários contadores de desempenho.

  • Verifique se há reservas de memória de execução de consulta em sys.dm_os_memory_clerks que type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Verifique se há consultas aguardando1 para concessões usando 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 Nesse cenário, o tipo de espera costuma ser RESOURCE_SEMAPHORE. Para obter mais informações, confira sys.dm_os_wait_stats (Transact-SQL).

  • Pesquisar cache para consultas com concessões de memória usando sys.dm_exec_cached_plans (Transact-SQL) e 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  
    
  • Se houver suspeita de uma consulta descontrolada, examine o Plano de Execução na coluna de sys.dm_exec_query_plan e o query_plan lote text de consultas de sys.dm_exec_sql_text. Examine ainda mais as consultas com uso intensivo de memória em execução no momento, usando 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
    

Confira também