sys.dm_exec_query_memory_grants (Transact-SQL)
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)
Retorna informações sobre todas as consultas solicitadas e que 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 nesta exibição. Por exemplo, as operações de junção de classificação e hash têm concessões de memória para execução de consulta, enquanto as 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 impactem a contenção do banco de dados ou expõem 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
são group_id
filtrados; o valor da coluna é definido como NULL.
Observação
Para chamá-lo de Azure Synapse Analytics ou 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 é o mesmo 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. Nota: Essa ID é exclusiva em versões de SQL Server anteriores a 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 de espera dentro do especificado queue_id . Esse valor poderá ser alterado para uma determinada consulta se outras consultas obtiverem concessões de memória ou atingirem o 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 com 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 com 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é este momento. Aplica-se a: SQL Server (começando com 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 com SQL Server 2016 (13.x)) e banco de dados SQL do Azure |
Permissões
No SQL Server, requer a permissão VIEW SERVER STATE
.
Em Banco de Dados SQL do Azure, requer a permissão VIEW DATABASE STATE
no banco de dados.
Permissões para SQL Server 2022 e posteriores
Requer a permissão VIEW SERVER PERFORMANCE STATE no servidor.
Comentários
Consultas que usam exibições de gerenciamento dinâmico que incluem ORDER BY
ou agregações 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. Começando com 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 sys.dm_exec_query_resource_semaphores
de pode ser até 20 vezes maior do que as linhas retornadas em SQL Server 2005 (9.x).
Exemplos
Um cenário típico de depuração para o tempo limite de 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 em cache 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
query_plan
coluna de sys.dm_exec_query_plan e consulte o lotetext
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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de