Cursos
Módulo
Exploración de la optimización del rendimiento de las consultas - Training
Exploración de la optimización del rendimiento de las consultas
Este explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
En este artículo se describe cómo usar el DBCC MEMORYSTATUS
comando para supervisar el uso de memoria.
Versión del producto original: SQL Server
Número de KB original: 907877
El DBCC MEMORYSTATUS
comando proporciona una instantánea del estado de memoria actual de Microsoft SQL Server y el sistema operativo. Proporciona una de las salidas más detalladas de la distribución y el uso de memoria en SQL Server. Puede usar la salida para solucionar problemas de consumo de memoria en SQL Server o para solucionar errores específicos de memoria insuficiente. Muchos errores de memoria insuficiente generan automáticamente esta salida en el registro de errores. Si experimenta un error relacionado con una condición de memoria baja, puede ejecutar el DBCC MEMORYSTATUS
comando y proporcionar la salida al ponerse en contacto con Soporte técnico de Microsoft.
La salida del DBCC MEMORYSTATUS
comando incluye secciones para la administración de memoria, el uso de memoria, la información de memoria agregada, la información del grupo de búferes y la información de caché de procedimientos. También describe la salida de objetos de memoria global, objetos de memoria de consulta, optimización y agentes de memoria.
Nota
Monitor de rendimiento (PerfMon) y el Administrador de tareas no tienen en cuenta el uso de memoria completa si La opción Páginas bloqueadas en memoria está habilitada. No hay contadores de rendimiento que muestren el uso de memoria de la API de extensiones de ventanas de direcciones (AWE).
Importante
El DBCC MEMORYSTATUS
comando está diseñado para ser una herramienta de diagnóstico para Soporte técnico de Microsoft. El formato de la salida y el nivel de detalle proporcionado están sujetos a cambios entre service packs y versiones de producto. La funcionalidad que proporciona el DBCC MEMORYSTATUS
comando puede reemplazarse por un mecanismo diferente en versiones posteriores del producto. Por lo tanto, en versiones posteriores del producto, es posible que este comando ya no funcione. No se proporcionarán advertencias adicionales antes de que se cambie o quite este comando. Por lo tanto, las aplicaciones que usan este comando pueden interrumpirse sin advertencia.
La salida del DBCC MEMORYSTATUS
comando ha cambiado de versiones anteriores de SQL Server. Actualmente, contiene varias tablas que no estaban disponibles en las versiones anteriores del producto.
DBCC MEMORYSTATUS
normalmente se usa para investigar problemas de memoria baja notificados por SQL Server. La memoria baja puede producirse si hay presión de memoria externa desde fuera del proceso de SQL Server o la presión interna que se origina dentro del proceso. La presión interna puede deberse al motor de base de datos de SQL Server o a otros componentes que se ejecutan dentro del proceso (como servidores vinculados, XPs, SQLCLR, protección contra intrusiones o software antivirus). Para obtener más información sobre cómo solucionar problemas de presión de memoria, consulte Solución de problemas de memoria insuficiente o de memoria insuficiente en SQL Server.
Estos son los pasos generales para usar el comando e interpretar sus resultados. Es posible que los escenarios específicos requieran que se acerque a la salida de forma un poco diferente, pero el enfoque general se describe aquí.
DBCC MEMORYSTATUS
.DBCC MEMORYSTATUS
para identificar qué componentes (distribuidor de memoria, Almacén de caché, Almacén de usuarios o Almacén de objetos) son el mayor colaborador de este uso de memoria.MEMORYCLEARK
, CACHESTORE
, USERSTORE
y OBJECTSTORE
. Examine su valor Asignado de páginas para determinar la cantidad de memoria que consume ese componente dentro de SQL Server. Para obtener una breve descripción de la mayoría de los componentes de memoria del motor de base de datos, consulte la tabla Tipos de distribuidor de memoria.
OBJECTSTORE_LOCK_MANAGER (node 0)
, OBJECTSTORE_LOCK_MANAGER (node 1)
, OBJECTSTORE_LOCK_MANAGER (node 2)
, etc. y, por último, observar un valor sumado de cada nodo en OBJECTSTORE_LOCK_MANAGER (Total)
. El mejor lugar para empezar es en la sección que informa del valor total y, a continuación, examina el desglose, según sea necesario. Para obtener más información, consulte Uso de memoria con nodos NUMA.DBCC MEMORYSTATUS
proporcionan información detallada y especializada sobre los asignadores de memoria concretos. Puede usar esas secciones para comprender detalles adicionales y ver un desglose adicional de las asignaciones dentro de un distribuidor de memoria. Entre los ejemplos de estas secciones se incluyen el grupo de búferes (datos y caché de índices), la caché de procedimientos o la caché del plan, los objetos de memoria de consulta (concesiones de memoria), la cola de optimización y las puertas de enlace pequeñas y medianas (memoria del optimizador). Si ya sabe que un componente determinado de la memoria en SQL Server es el origen de la presión de memoria, es posible que prefiera ir directamente a esa sección específica. Por ejemplo, si ha establecido de alguna otra manera que hay un uso elevado de concesiones de memoria que provocan errores de memoria, puede revisar la sección Objetos de memoria de consulta.En el resto de este artículo se describen algunos de los contadores útiles de la DBCC MEMORYSTATUS
salida que pueden permitirle diagnosticar problemas de memoria de forma más eficaz.
En esta sección se proporciona una salida de ejemplo en un formato tabular y se describen sus valores.
Process/System Counts Value
------------------------------------ ------------
Available Physical Memory 5060247552
Available Virtual Memory 140710048014336
Available Paging File 7066804224
Working Set 430026752
Percent of Committed Memory in WS 100
Page Faults 151138
System physical memory high 1
System physical memory low 0
Process physical memory low 0
Process virtual memory low 0
En la lista siguiente se describen los valores y sus descripciones:
Los cuatro valores restantes son binarios o booleanos.
En esta sección se proporciona una salida de ejemplo del Administrador de memoria que muestra el consumo general de memoria por parte de SQL Server.
Memory Manager KB
-------------------------- --------------------
VM Reserved 36228032
VM Committed 326188
Locked Pages Allocated 0
Large Pages Allocated 0
Emergency Memory 1024
Emergency Memory In Use 16
Target Committed 14210416
Current Committed 326192
Pages Allocated 161904
Pages Reserved 0
Pages Free 5056
Pages In Use 286928
Page Alloc Potential 15650992
NUMA Growth Phase 0
Last OOM Factor 0
Last OS Error 0
En la lista siguiente se describen los valores de la salida y sus descripciones:
Reservado de máquina virtual: este valor muestra la cantidad total de espacio de direcciones virtuales (VAS) o memoria virtual (VM) que SQL Server ha reservado. La reserva de memoria virtual no usa realmente memoria física; simplemente significa que las direcciones virtuales se reservan de dentro de la VAS grande. Para obtener más información, consulte VirtualAlloc(), MEM_RESERVE.
VM Confirmada: este valor muestra la cantidad total de memoria virtual (VM) que SQL Server ha confirmado (en KB). Esto significa que la memoria usada por el proceso está respaldada por memoria física o con menos frecuencia por archivo de página. Las direcciones de memoria reservadas anteriormente están respaldadas por un almacenamiento físico; es decir, se asignan. Si las páginas bloqueadas en memoria están habilitadas, SQL Server usa un método alternativo para asignar memoria, la API de AWE y la mayoría de la memoria no se refleja en este contador. Consulte [Páginas bloqueadas asignadas](#Locked Páginas asignadas) para esas asignaciones. Para obtener más información, consulte VirtualAlloc(), MEM_COMMIT.
Páginas asignadas: este valor muestra el número total de páginas de memoria asignadas por el motor de base de datos de SQL Server.
Páginas bloqueadas asignadas: este valor representa la cantidad de memoria, en kilobytes (KB), que SQL Server ha asignado y bloqueado en la RAM física mediante la API de AWE. Indica la cantidad de memoria que SQL Server usa activamente y ha solicitado mantenerse en memoria para optimizar el rendimiento. Al bloquear páginas en memoria, SQL Server garantiza que las páginas críticas de la base de datos están disponibles y no se intercambian al disco. Para obtener más información, vea Address Windows Extensions (AWE) memory (Memoria de Extensiones de Windows para direcciones[AWE]). Un valor de cero indica que la característica "páginas bloqueadas en memoria" está deshabilitada actualmente y SQL Server usa memoria virtual en su lugar. En tal caso, el valor de VM Committed representaría la memoria asignada a SQL Server.
Páginas grandes asignadas: este valor representa la cantidad de memoria asignada por SQL Server mediante páginas grandes. Páginas grandes es una característica de administración de memoria proporcionada por el sistema operativo. En lugar de usar el tamaño de página estándar (normalmente 4 KB), esta característica usa un tamaño de página mayor, como 2 MB o 4 MB. Un valor de cero indica que la característica no está habilitada. Para obtener más información, vea Virtual Alloc(), MEM_LARGE_PAGES.
Destino confirmado: este valor indica la cantidad de memoria de destino que SQL Server tiene como objetivo haber confirmado, una cantidad ideal de memoria que SQL Server podría consumir, en función de la carga de trabajo reciente.
Confirmado actual: este valor indica la cantidad de memoria del sistema operativo (en KB) que el administrador de memoria de SQL Server ha confirmado (asignado en el almacén físico). Este valor incluye "páginas bloqueadas en memoria" (API de AWE) o memoria virtual. Por lo tanto, este valor está cerca o igual que la máquina virtual confirmada o las páginas bloqueadas asignadas. Tenga en cuenta que, cuando SQL Server usa la API de AWE, el Administrador de memoria virtual del sistema operativo sigue asignando memoria y se reflejará como máquina virtual confirmada.
Fase de crecimiento de NUMA: este valor indica si SQL Server está actualmente en una fase de crecimiento de NUMA. Para obtener más información sobre esta rampa inicial de memoria cuando existen nodos NUMA en la máquina, vea How It Works: SQL Server (NUMA Local, Foreign and Away Memory Blocks).
Último error del sistema operativo: este valor muestra el último error del sistema operativo que se produjo cuando se produjo una presión de memoria en el sistema. SQL Server registra el error del sistema operativo y lo muestra en la salida. Para obtener una lista completa de los errores del sistema operativo, consulte Códigos de error del sistema.
La sección Administrador de memoria va seguida de un resumen del uso de memoria para cada nodo de memoria. En un sistema habilitado para el acceso a memoria no uniforme (NUMA), hay una entrada de nodo de memoria correspondiente para cada nodo NUMA de hardware. En un sistema SMP, hay una sola entrada de nodo de memoria. El mismo patrón se aplica a otras secciones de memoria.
Memory node Id = 0 KB
----------------------- -----------
VM Reserved 21289792
VM Committed 272808
Locked Pages Allocated 0
Pages Allocated 168904
Pages Free 3040
Target Committed 6664712
Current Committed 272808
Foreign Committed 0
Away Committed 0
Taken Away Committed 0
Nota
Memory node Id
posible que el valor no se corresponda con el identificador de nodo de hardware.En la lista siguiente se describen los valores de la tabla de salida y sus descripciones:
La tabla siguiente contiene información de memoria agregada para cada tipo de distribuidor y nodo NUMA. En el caso de un sistema habilitado para NUMA, es posible que vea la salida similar a la siguiente:
MEMORYCLERK_SQLGENERAL (node 0) KB
------------------------------ --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 5416
MEMORYCLERK_SQLGENERAL (node 1) KB
------------------------------- --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 136
MEMORYCLERK_SQLGENERAL (Total) KB
------------------------------- --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 5552
El valor de muestra el número total de páginas de memoria asignadas a por un componente específico (distribuidor de Pages Allocated
memoria, almacén de usuarios, almacén de objetos o almacén de caché).
Nota
Estos identificadores de nodo corresponden a la configuración del nodo NUMA del equipo que ejecuta SQL Server. Los identificadores de nodo incluyen posibles nodos NUMA de software definidos sobre nodos NUMA de hardware o encima de un sistema SMP. Para buscar la asignación entre identificadores de nodo y CPU para cada nodo, vea Information Event ID 17152. Este evento se registra en el registro de aplicación en Visor de eventos al iniciar SQL Server.
En el caso de un sistema SMP, solo verá una tabla para cada tipo de distribuidor, sin contar el nodo = 64 usado por la DAC. Esta tabla es similar al ejemplo siguiente.
MEMORYCLERK_SQLGENERAL (Total) KB
--------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 2928
Otra información de estas tablas es sobre la memoria compartida:
Como método alternativo, puede obtener información de resumen para cada tipo de distribuidor para todos los nodos de memoria mediante la vista de administración dinámica (DMV) de sys.dm_os_memory_clerks . Para ello, ejecute la consulta siguiente:
SELECT
TYPE,
SUM(virtual_memory_reserved_kb) AS [VM Reserved],
SUM(virtual_memory_committed_kb) AS [VM Committed],
SUM(awe_allocated_kb) AS [AWE Allocated],
SUM(shared_memory_reserved_kb) AS [SM Reserved],
SUM(shared_memory_committed_kb) AS [SM Committed],
-- SUM(multi_pages_kb) AS [MultiPage Allocator], /*Applies to: SQL Server 2008 (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
-- SUM(single_pages_kb) AS [SinlgePage Allocator], /*Applies to: SQL Server 2008 (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
SUM(pages_kb) AS [Page Allocated] /*Applies to: SQL Server 2012 (11. x) and later.*/
FROM sys.dm_os_memory_clerks
GROUP BY TYPE
Esta es una sección importante que proporciona un desglose de diferentes datos de estados y páginas de índice dentro del grupo de búferes, también conocido como caché de datos. En la tabla de salida siguiente se enumeran los detalles sobre el grupo de búferes y otra información.
Buffer Pool Pages
------------------------------------------------- ---------
Database 5404
Simulated 0
Target 16384000
Dirty 298
In IO 0
Latched 0
IO error 125
In Internal Pool 0
Page Life Expectancy 3965
En la lista siguiente se describen los valores de la salida y sus descripciones:
Puede obtener información detallada sobre el grupo de búferes para las páginas de base de datos mediante la sys.dm_os_buffer_descriptors
DMV. Pero use esta DMV con precaución, ya que puede ejecutarse mucho tiempo y producir una salida enorme si el servidor basado en SQL Server puede tener una gran cantidad de RAM a su disposición.
En esta sección se describe la memoria caché del plan a la que se hizo referencia anteriormente como caché de procedimientos.
Procedure Cache Value
----------------------- -----------
TotalProcs 4
TotalPages 25
InUsePages 0
En la lista siguiente se describen los valores de la salida y sus descripciones:
TotalProcs: este valor muestra el total de objetos almacenados en caché actualmente en la memoria caché de procedimientos. Este valor coincide con el número de entradas de la sys.dm_exec_cached_plans
DMV.
Nota
Debido a la naturaleza dinámica de esta información, es posible que la coincidencia no sea exacta. Puede usar PerfMon para supervisar el objeto SQL Server: Plan Cache y la sys.dm_exec_cached_plans
DMV para obtener información detallada sobre el tipo de objetos almacenados en caché, como desencadenadores, procedimientos y objetos ad hoc.
TotalPages: muestra las páginas acumulativas usadas para almacenar todos los objetos almacenados en caché en el plan o en la memoria caché de procedimientos. Puede multiplicar este número por 8 KB para obtener el valor expresado en KB.
InUsePages: muestra las páginas de la caché de procedimientos que pertenecen a procedimientos que están activos actualmente. Estas páginas no se pueden descartar.
Esta sección contiene información sobre varios objetos de memoria global y la cantidad de memoria que usan.
Global Memory Objects Buffers
---------------------------------- ----------------
Resource 576
Locks 96
XDES 61
DirtyPageTracking 52
SETLS 8
SubpDesc Allocators 8
SE SchemaManager 139
SE Column Metadata Cache 159
SE Column Metadata Cache Store 2
SE Column Store Metadata Cache 8
SQLCache 224
Replication 2
ServerGlobal 1509
XP Global 2
SortTables 3
En la lista siguiente se describen los valores de la salida y sus descripciones:
En esta sección se describe la información de concesión de memoria de consulta. También incluye una instantánea del uso de memoria de consulta. La memoria de consulta también se conoce como "memoria del área de trabajo".
Query Memory Objects (default) Value
---------------------------------------- -------
Grants 0
Waiting 0
Available 436307
Current Max 436307
Future Max 436307
Physical Max 436307
Next Request 0
Waiting For 0
Cost 0
Timeout 0
Wait Time 0
Si el tamaño y el costo de una consulta satisfacen los umbrales de memoria de consulta "pequeños", la consulta se coloca en una cola de consultas pequeña. Este comportamiento impide que las consultas más pequeñas se retrase detrás de las consultas más grandes que ya están en la cola.
En la lista siguiente se describen los valores de la salida y sus descripciones:
Available
valor se actualiza periódicamente.Next Request
valor multiplicado por un factor de espacio para la cabeza. Este valor garantiza eficazmente que una cantidad específica de memoria estará disponible cuando se ejecute la siguiente consulta en espera.Para obtener más información sobre las concesiones de memoria, qué significan estos valores y cómo solucionar problemas de concesiones de memoria, consulte Solución de problemas de rendimiento lento o de memoria insuficiente causados por concesiones de memoria en SQL Server.
Las consultas se envían al servidor para su compilación. El proceso de compilación incluye análisis, álgebra y optimización. Las consultas se clasifican en función de la memoria que consume cada consulta durante el proceso de compilación.
Nota
Esta cantidad no incluye la memoria necesaria para ejecutar la consulta.
Cuando se inicia una consulta, no hay ningún límite en el número de consultas que se pueden compilar. A medida que aumenta el consumo de memoria y alcanza un umbral, la consulta debe pasar una puerta de enlace para continuar. Hay un límite progresivamente reducido de consultas compiladas simultáneamente después de cada puerta de enlace. El tamaño de cada puerta de enlace depende de la plataforma y de la carga. Los tamaños de puerta de enlace se eligen para maximizar la escalabilidad y el rendimiento.
Si la consulta no puede pasar una puerta de enlace, espera hasta que la memoria esté disponible o devuelva un error de tiempo de espera (error 8628). Además, es posible que la consulta no adquiera una puerta de enlace si cancela la consulta o si se detecta un interbloqueo. Si la consulta pasa varias puertas de enlace, no libera las puertas de enlace más pequeñas hasta que se haya completado el proceso de compilación.
Este comportamiento permite que solo se produzcan algunas compilaciones que consumen mucha memoria al mismo tiempo. Además, este comportamiento maximiza el rendimiento de las consultas más pequeñas.
En la tabla siguiente se proporcionan detalles de las esperas de memoria que se producen debido a una memoria insuficiente para la optimización de consultas. Las cuentas de memoria interna para la memoria del optimizador que usan las consultas del sistema, mientras que la memoria de optimización de informes predeterminada para las consultas de usuario o aplicación.
Optimization Queue (internal) Value
---------------------------------- ----------------
Overall Memory 4013162496
Target Memory 3673882624
Last Notification 1
Timeout 6
Early Termination Factor 5
Small Gateway (internal) Value
---------------------------------- ----------------
Configured Units 32
Available Units 32
Acquires 0
Waiters 0
Threshold Factor 380000
Threshold 380000
Medium Gateway (internal) Value
---------------------------------- ----------------
Configured Units 8
Available Units 8
Acquires 0
Waiters 0
Threshold Factor 12
Threshold -1
Big Gateway (internal) Value
---------------------------------- ----------------
Configured Units 1
Available Units 1
Acquires 0
Waiters 0
Threshold Factor 8
Threshold -1
Optimization Queue (default) Value
---------------------------------- ----------------
Overall Memory 4013162496
Target Memory 3542319104
Last Notification 1
Timeout 6
Early Termination Factor 5
Small Gateway (default) Value
---------------------------------- ----------------
Configured Units 32
Available Units 32
Acquires 0
Waiters 0
Threshold Factor 380000
Threshold 380000
Medium Gateway (default) Value
---------------------------------- ----------------
Configured Units 8
Available Units 8
Acquires 0
Waiters 2
Threshold Factor 12
Threshold -1
Big Gateway (default) Value
---------------------------------- ----------------
Configured Units 1
Available Units 1
Acquires 0
Waiters 0
Threshold Factor 8
Threshold -1
Esta es una descripción de algunos de estos valores:
Available Units
sería de 32 menos 3 o 29 unidades.A time out occurred while waiting to optimize the query. Rerun the query.
En esta sección se proporciona información sobre los agentes de memoria que controlan la memoria almacenada en caché, la memoria robada y la memoria reservada. Puede usar la información de estas tablas solo para diagnósticos internos. Por lo tanto, esta información no se detalla.
MEMORYBROKER_FOR_CACHE (internal) Value
--------------------------------------- -------------
Allocations 20040
Rate 0
Target Allocations 3477904
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_STEAL (internal) Value
--------------------------------------- -------------
Allocations 129872
Rate 40
Target Allocations 3587776
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_RESERVE (internal) Value
--------------------------------------- -------------
Allocations 0
Rate 0
Target Allocations 3457864
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_CACHE (default) Value
--------------------------------------- -------------
Allocations 44592
Rate 8552
Target Allocations 3511008
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_STEAL (default) Value
--------------------------------------- -------------
Allocations 1432
Rate -520
Target Allocations 3459296
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_RESERVE (default) Value
--------------------------------------- -------------
Allocations 0
Rate 0
Target Allocations 3919104
Future Allocations 872608
Overall 3919104
Last Notification 1
Cursos
Módulo
Exploración de la optimización del rendimiento de las consultas - Training
Exploración de la optimización del rendimiento de las consultas
Documentación
Supervisar el uso de la memoria - SQL Server
Supervise una instancia de SQL Server para confirmar que el uso de memoria se encuentra dentro de los rangos normales. Use los contadores de bytes disponibles para memoria y páginas de memoria por segundo.
Solución de los problemas de memoria insuficiente o poca memoria en SQL Server - SQL Server
Proporciona los pasos de solución de problemas para solucionar problemas de memoria insuficiente o memoria insuficiente en SQL Server.
Supervisión y solución de problemas de uso de la memoria con OLTP en memoria - SQL Server
Obtenga información sobre la supervisión y la solución de problemas del uso de memoria de OLTP en memoria, que tiene patrones distintos a los de las tablas basadas en disco de SQL Server.