sys.dm_exec_query_memory_grants (Transact-SQL)

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database síAzure Synapse Analytics síAlmacenamiento de datos paralelos

Devuelve información sobre todas las consultas que han solicitado y están esperando una concesión de memoria o se les ha concedido una concesión de memoria. Las consultas que no requieren una concesión de memoria no aparecerán en esta vista. Por ejemplo, las operaciones de ordenación y combinación hash tienen concesiones de memoria para la ejecución de consultas, mientras que las consultas sin una cláusula ORDER BY no tendrán una concesión de memoria.

En Azure SQL Database, las vistas de administración dinámica no pueden exponer información que impactaría a la contención de la base de datos ni acerca de otras bases de datos a las que el usuario tenga acceso. Para evitar exponer esta información, se filtran todas las filas que contienen datos que no pertenecen al inquilino conectado. Además, se filtran los valores de las columnas , , y el scheduler_id valor de columna se establece en wait_order pool_id group_id NULL.

Nota

Para llamar a esto Azure Synapse Analytics desde o , use el nombre Sistema de la plataforma de análisis (PDW) sys.dm_pdw_nodes_exec_query_memory_grants . El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Nombre de la columna Tipo de datos Descripción
session_id smallint Id. (SPID) de la sesión en la que se está ejecutando esta consulta.
id_de_solicitud int Id. de la solicitud. Es único en el contexto de la sesión.
scheduler_id int Id. del programador que programa esta consulta.
Dop smallint Grado de paralelismo de esta consulta.
request_time datetime Fecha y hora a la que esta consulta solicitó la concesión de memoria.
grant_time datetime Fecha y hora a la que se concedió la memoria para esta consulta. Es NULL si aún no se ha concedido la memoria.
requested_memory_kb bigint Memoria solicitada total en kilobytes.
granted_memory_kb bigint Memoria total realmente otorgada en kilobytes. Puede ser NULL si aún no se ha concedido la memoria. En una situación típica, este valor debe ser el mismo que requested_memory_kb . En la creación de índices, el servidor puede permitir memoria adicional a petición además de la memoria concedida inicialmente.
required_memory_kb bigint Memoria mínima necesaria para ejecutar esta consulta en kilobytes. requested_memory_kb es igual o mayor que esta cantidad.
used_memory_kb bigint Memoria física usada en este momento en kilobytes.
max_used_memory_kb bigint Memoria física máxima usada hasta este momento en kilobytes.
query_cost float Costo estimado de la consulta.
timeout_sec int Tiempo de espera en segundos antes de que esta consulta abandone la solicitud de concesión de memoria.
resource_semaphore_id smallint Identificador no único del semáforo de recursos al que está esperando esta consulta.

Nota: Este identificador es único en versiones de SQL Server anteriores a SQL Server 2008 . Este cambio puede afectar a la solución de problemas de ejecución de consultas. Para obtener más información, vea la sección "Comentarios" más adelante en este artículo.
queue_id smallint Id. de la cola de espera en la que esta consulta espera las concesiones de memoria. Es NULL si ya se ha concedido la memoria.
wait_order int Orden secuencial de las consultas en espera dentro del queue_id especificado. Este valor puede cambiar para una consulta determinada si otras consultas obtienen concesiones de memoria o tiempo de espera. NULL si ya se ha concedido memoria.
is_next_candidate bit Candidata para la siguiente concesión de memoria.

1 = Sí

0 = No

NULL = Ya se ha concedido la memoria.
wait_time_ms bigint Tiempo de espera en milisegundos. Es NULL si ya se ha concedido la memoria.
plan_handle varbinary(64) Identificador de este plan de consulta. Use sys.dm_exec_query_plan para extraer el plan XML real.
sql_handle varbinary(64) Identificador del texto de Transact-SQL de esta consulta. Use sys.dm_exec_sql_text para obtener el texto Transact-SQL real.
group_id int Id. para el grupo de cargas de trabajo donde se está ejecutando la consulta.
pool_id int Id. del grupo de recursos de servidor al que pertenece este grupo de cargas de trabajo.
is_small tinyint Cuando se establece en 1, indica que esta concesión utiliza el semáforo de recursos pequeño. Cuando se establece en 0, indica que se utiliza un semáforo normal.
ideal_memory_kb bigint Tamaño, en kilobytes (KB), de la concesión de memoria para ajustar todo en la memoria física. Está basado en la estimación de la cardinalidad.
pdw_node_id int Identificador del nodo en el que se encuentra esta distribución.

Se aplica a: Azure Synapse Analytics , Sistema de la plataforma de análisis (PDW)
reserved_worker_count bigint Número de subprocesos de trabajo reservados.

Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x)) y Azure SQL Database
used_worker_count bigint Número de subprocesos de trabajo usados en este momento.

Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x)) y Azure SQL Database
max_used_worker_count bigint Número máximo de subprocesos de trabajo usados hasta este momento.

Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x)) y Azure SQL Database
reserved_node_bitmap bigint Mapa de bits de nodos NUMA donde se reservan subprocesos de trabajo.

Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x)) y Azure SQL Database

Permisos

En SQL Server , requiere VIEW SERVER STATE permiso.
En Azure SQL Database, requiere el permiso VIEW DATABASE STATE en la base de datos.

Comentarios

Las consultas que usan vistas de administración dinámica que incluyen o agregan pueden aumentar el consumo de memoria y, por tanto, contribuir al ORDER BY problema que están solucionando.

La característica del regulador de recursos permite que un administrador de bases de datos distribuya los recursos del servidor entre los grupos de recursos de servidor, hasta un máximo de 64 fondos. A partir SQL Server 2008 de , cada grupo se comporta como una pequeña instancia de servidor independiente y requiere dos semáforos. El número de filas que se devuelven de puede ser hasta 20 veces mayor que las filas que sys.dm_exec_query_resource_semaphores se devuelven en SQL Server 2005 (9.x) .

Ejemplos

Un escenario de depuración típico para el tiempo de espera de consulta puede investigar lo siguiente:

  • Compruebe el estado de la memoria del sistema global con sys.dm_os_memory_clerks, sys.dm_os_sys_info y diversos contadores de rendimiento.

  • Compruebe si hay reservas de memoria de ejecución de consultas sys.dm_os_memory_clerks en donde type = 'MEMORYCLERK_SQLQERESERVATIONS' .

  • Compruebe si hay consultas que esperan1 para las concesiones mediante 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 En este caso, el tipo de espera normalmente es RESOURCE_SEMAPHORE. Para obtener más información, vea sys.dm_os_wait_stats (Transact-SQL).

  • Búsqueda en caché de consultas con concesiones de memoria mediante sys.dm_exec_cached_plans (Transact-SQL)y 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  
    
  • Si se sospecha de una consulta desboda, examine el plan de presentación de la columna de sys.dm_exec_query_plan y el lote de consultas query_plan de text sys.dm_exec_sql_text. Examine aún más las consultas que consumen mucha memoria que se están ejecutando actualmente, mediante 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
    

Consulte también