Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Applies to:Azure SQL Database
SQL database in Fabric
Es posible que veas mensajes de error cuando el motor de base de datos SQL no ha podido asignar suficiente memoria para ejecutar la consulta. Esto puede deberse a varias razones, como los límites del objetivo de servicio seleccionado, las demandas de la memoria de carga de trabajo agregadas y las demandas de memoria de la consulta.
Para obtener más información sobre el límite de recursos de memoria para Azure SQL Database, consulte Gestión de recursos en Azure SQL Database. Fabric SQL Database comparte muchas características con Azure SQL Database, para obtener más información sobre la supervisión del rendimiento, consulte Supervisión del rendimiento de la base de datos SQLfabric.
Para obtener más información sobre cómo solucionar problemas de memoria insuficiente en SQL Server, consulte MSSQLSERVER_701.
Pruebe las siguientes vías de investigación en respuesta a:
- Código de error 701 con el mensaje de error "No hay suficiente memoria del sistema en el grupo de recursos '%ls' para ejecutar esta consulta".
- Código de error 802 con el mensaje de error "No hay memoria suficiente disponible en el grupo de búferes".
Visualización de eventos de memoria insuficiente
Si encuentra errores de falta de memoria, revise sys.dm_os_out_of_memory_events. Esta vista incluye información de la causa de insuficiencia de memoria prevista que viene determinada por un algoritmo heurístico y que se proporciona con un grado finito de confianza.
SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;
Investiga la asignación de memoria
Si los errores de memoria insuficiente persisten en Azure SQL Database, considere la posibilidad de aumentar temporalmente el objetivo de nivel de servicio de la base de datos en el portal de Azure.
Si los errores de memoria insuficiente persisten, usa las siguientes consultas para buscar concesiones de memoria de consulta inusualmente altas que puedan contribuir a una condición de memoria insuficiente. Ejecute las consultas de ejemplo siguientes en la base de datos que experimentaron el error (no en la base de datos master del servidor lógico de Azure SQL).
Uso de DMV para ver eventos de memoria insuficiente
El sys.dm_os_out_of_memory_events permite la visibilidad de los eventos y las causas de los eventos de memoria insuficiente (OOM) en Azure SQL Database. El evento extendido summarized_oom_snapshot forma parte de la sesión de eventos existente system_health para simplificar la detección. Para más información, consulta sys.dm_os_out_of_memory_events y Blog: Una nueva manera de solucionar errores de memoria insuficiente en el motor de base de datos.
Usar vistas de administración dinámica (DMV) para ver los encargados de memoria
Comience con una investigación amplia, si el error de falta de memoria ocurrió recientemente, consultando la asignación de memoria a los jefes de memoria. Los encargados de memoria son internos al motor de base de datos para Azure SQL Database. Los principales administradores de memoria en términos de páginas asignadas pueden proporcionar información sobre qué tipo de consulta o característica de SQL Server consume la mayor parte de la memoria.
SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY pages_kb DESC;
GO
SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY virtual_memory_committed_kb DESC;
- Algunos administradores de memoria comunes, como MEMORYCLERK_SQLQERESERVATIONS, se resuelven mejor mediante la identificación de consultas con grandes concesiones de memoria, mejorando su rendimiento a través de una mejor indexación y optimización de índices.
- Aunque OBJECTSTORE_LOCK_MANAGER no está relacionado con las concesiones de memoria, se espera que sea alto cuando las consultas reclamen muchos bloqueos; por ejemplo, debido a una extensión de bloqueo deshabilitada o a transacciones muy grandes.
- Se espera que algunos administradores de memoria tengan la utilización más alta: MEMORYCLERK_SQLBUFFERPOOL es casi siempre el administrador principal, mientras que CACHESTORE_COLUMNSTOREOBJECTPOOL será alto cuando se usen índices columnstore. Se espera una alta utilización por parte de estos empleados.
Para obtener más información sobre los tipos de controlador de memoria, consulte sys.dm_os_memory_clerks.
Utilice las DMVs para investigar consultas activas
En la mayoría de los casos, la consulta que falló no es la causa de este error.
La siguiente consulta de ejemplo para Azure SQL Database devuelve información importante sobre las transacciones que están reteniendo o esperando asignaciones de memoria. Examine las consultas principales identificadas para el examen y el ajuste del rendimiento y evalúe si se ejecutan según lo previsto. Tenga en cuenta el tiempo de las consultas de informes que consumen mucha memoria o las operaciones de mantenimiento.
--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;
Puedes decidir usar la instrucción KILL para detener una consulta que se está ejecutando actualmente y que está manteniendo o esperando una concesión de memoria grande. Use esta instrucción con cuidado, especialmente cuando se estén ejecutando procesos críticos. Para obtener más información, vea KILL (Transact-SQL).
Uso de Query Store para investigar el uso de memoria de consulta anterior
Aunque la consulta de ejemplo anterior solo informa de los resultados de las consultas dinámicas, la consulta siguiente usa el Query Store para devolver información sobre la ejecución de consultas pasadas. Esto puede serle útil para investigar un error de falta de memoria que se produjo en el pasado.
La siguiente consulta de ejemplo para Azure SQL Database devuelve información importante sobre las ejecuciones de consulta registradas por el Query Store. Examine las consultas principales identificadas para el examen y el ajuste del rendimiento y evalúe si se ejecutan según lo previsto. Tenga en cuenta el filtro de tiempo en qsp.last_execution_time para restringir los resultados al historial reciente. Puede ajustar la cláusula TOP para generar más o menos resultados en función de su entorno.
SELECT TOP 10 PERCENT --limit results
a.plan_id, query_id, plan_group_id, query_sql_text
, query_plan = TRY_CAST(query_plan as XML)
, avg_query_max_used_memory
, min_query_max_used_memory
, max_query_max_used_memory
, last_query_max_used_memory
, last_execution_time
, query_count_executions
FROM (
SELECT
qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
, last_execution_time = MAX(qsp.last_execution_time)
, query_count_executions = SUM(qsrs.count_executions)
, avg_query_max_used_memory = AVG(qsrs.avg_query_max_used_memory)
, min_query_max_used_memory = MIN(qsrs.min_query_max_used_memory)
, max_query_max_used_memory = MAX(qsrs.max_query_max_used_memory)
, last_query_max_used_memory = MAX(qsrs_latest.last_query_max_used_memory) --only from latest result
FROM sys.query_store_plan AS qsp
INNER JOIN sys.query_store_query AS qsq
ON qsp.query_id = qsq.query_id
INNER JOIN sys.query_store_query_text AS qsqt
ON qsq.query_text_id = qsqt.query_text_id
INNER JOIN sys.query_store_runtime_stats AS qsrs
ON qsp.plan_id = qsrs.plan_id
INNER JOIN (SELECT plan_id
, last_query_max_used_memory
, rownum = ROW_NUMBER() OVER (PARTITION BY plan_id ORDER BY last_execution_time DESC)
FROM sys.query_store_runtime_stats qsrs) AS qsrs_latest
ON qsrs_latest.plan_id = qsp.plan_id
AND qsrs_latest.rownum = 1 --use latest last_query_max_used_memory per plan_id
WHERE DATEADD(hour, -24, sysdatetime()) < qsp.last_execution_time --past 24 hours only
AND qsrs_latest.last_query_max_used_memory > 0
GROUP BY qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
) AS a
ORDER BY max_query_max_used_memory DESC, avg_query_max_used_memory DESC;
Eventos extendidos
Además de la información anterior, puede resultar útil capturar un seguimiento de las actividades del servidor para investigar exhaustivamente un problema de memoria insuficiente en Azure SQL Database.
Hay dos maneras de capturar rastros en SQL Server: Eventos Extendidos (XEvents) y Rastros del Profiler. Sin embargo, la tecnología de seguimiento en desuso de SQL Server Profiler no es compatible con Azure SQL Database. Extended Events es la tecnología de seguimiento más reciente que permite una mayor versatilidad y menos impacto en el sistema observado y su interfaz se integra en SQL Server Management Studio (SSMS). Para obtener más información sobre cómo consultar eventos extendidos en Azure SQL Database, consulte Eventos extendidos en Azure SQL Database.
Consulte el documento que explica cómo utilizar el Asistente para Nueva Sesión de Eventos Extendidos en SSMS. Sin embargo, para las bases de datos de Azure SQL, SSMS proporciona una subcarpeta Eventos extendidos en cada base de datos de Object Explorer. Use una sesión de eventos extendidos para capturar estos eventos útiles e identificar las consultas que los generan:
Errores de categoría:
error_reportedexchange_spillhash_spill_details
Ejecución de categoría:
excessive_non_grant_memory_used
Memoria de categoría:
query_memory_grant_blockingquery_memory_grant_usage
summarized_oom_snapshotLa captura de bloques de asignación de memoria, desbordamientos de asignación de memoria o asignaciones de memoria excesivas puede ser una pista potencial que indica que una consulta está tomando repentinamente más memoria de la que tenía en el pasado, y una posible explicación para un error emergente de falta de memoria en una carga de trabajo existente. El evento extendido
summarized_oom_snapshotforma parte de la sesión de eventos existentesystem_healthpara simplificar la detección. Para más información, consulta Blog: Una nueva manera de solucionar errores de memoria insuficiente en el motor de base de datos.
OLTP en memoria sin recursos de memoria
Puedes encontrar Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation si usas OLTP en memoria. Reduzca la cantidad de datos en tablas optimizadas para memoria y parámetros con valores de tabla optimizados para memoria, o escale verticalmente la base de datos a un objetivo de servicio superior para tener más memoria. Para obtener más información sobre problemas de memoria insuficiente con SQL Server In-Memory OLTP, consulte Resolve Out Of Memory issues.
Obtener soporte técnico de Azure SQL Database
Si los errores de memoria insuficiente persisten en Azure SQL Database, realice una solicitud de soporte de Azure seleccionando Get Support en el sitio Azure Support.
Contenido relacionado
- Procesamiento de consultas inteligente en bases de datos SQL
- Guía de arquitectura de procesamiento de consultas
- Centro de Rendimiento para el Motor de Base de Datos de SQL Server y Base de Datos SQL de Azure
- Solución de problemas de conectividad y otros errores con Azure SQL Database y Azure SQL Managed Instance
- Solucionar errores de conexión transitorios en SQL Database y SQL Managed Instance
- Solución de errores del registro de transacciones
- Demostración del procesamiento de consultas inteligentes
- Administración de recursos en Azure SQL Database
- Blog: Una nueva manera de solucionar errores de memoria insuficiente en el motor de base de datos