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 PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics
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
quetype = '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
lotetext
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
- sys.dm_exec_query_resource_semaphores (Transact-SQL)
- sys.dm_os_wait_stats (Transact-SQL)
- Funções e exibições de gerenciamento dinâmico relacionadas à execução (Transact-SQL)
- Guia de arquitetura de thread e tarefa
- MSSQLSERVER_701
- Solucionar problemas com erros de falta de memória no Banco de Dados SQL do Azure