Ir al contenido principal

Porqeu aumenta la memoria RAM consumida por SQL Server?

SQL Server presenta un comportamiento, para muchos algo peculiar, del consumo de memoria (es decir, como va tomando la memoria del Sistema Operativo, y como la va liberando). Este comportamiento, es una de las principales dudas existenciales de SQL Server para quienes empiezan. En este capítulo, explicamos cómo SQL Server toma y libera memoria, las opciones de configuración para limitar el consumo de memoria de SQL Server (min server memory y max server memory), la utilización de sp_configure y RECONFIGURE para comprobar o cambiar la configuración de limitación de memoria de SQL Server, consideraciones de la memoria al utilizar múltiples instancias de SQL Server, etc.

SQL Server, por defecto al iniciarse (es decir, al arrancar el servicio sqlservr.exe), consume el mínimo de memoria RAM necesaria. Sin embargo, según empieza a trabajar (despachar consultas de nuestros usuarios, realizar Backups y otras tareas de Planes de Mantenimiento, etc.), como cualquier motor de base de datos, lee las páginas de los ficheros y las carga en buffers de memoria. Del mismo modo, es capaz de generar/compilar los planes de ejecución de consultas y procedimientos almacenados, depositando el correspondiente plan de ejecución en memoria para permitir reutilizarlo (eso sí, es una zona de memoria distinta de los buffers de memoria de datos). Por defecto, utilizará toda la memoria RAM que necesite (y que pueda utilizar, dadas las limitaciones de todo hardware), pero eso sí, la irá utilizando según la necesite y evitando la paginación (es decir, utilizará toda la memoria física que necesite, excepto en algunos casos: un Windows Vista con SQL Express y 512 MB de RAM está condenado a paginar). Este comportamiento de aumento de memoria, visto desde fuera, puede llevar a confusión, y pensar que SQL Server se vuelve loco y empieza consumuir toda la memoria RAM existente sin motivo aparente. Sin embargo, es un comportamiento normal, y no sólo eso, sino que además, esta gestión dinámica y automática de la memoria en SQL Server es la configuración recomendada.
Es posible limitar la cantidad máxima de memoria RAM que deseamos que consuma una Instancia de SQL Server. Sin embargo, habitualmente en entornos de producción de medias y grandes compañías, se trata de servidores dedicados de base de datos, por lo que esta configuración no tiene sentido. Más aún, no es recomendable compartir la máquina que ejecuta SQL Server, con otros servicios de la empresa (ej: Directorio Activo, Exchange, etc.), aunque existen casos en que es así por ahorro de costes y licencias (véase el caso de Microsoft BackOffice Small Business ó Microsoft Windows Small Business Server 2003).
Si deseamos establecer el límite de memoria RAM que puede consumir una Instancia de SQL Server, deberemos utilizar el procedimiento almacenado sp_configure, pudiendo establecer el valor de las propiedades min server memory y max server memory. Esta configuración puede realizarse sin reiniciar la instancia de SQL Server. Sin embargo, es una configuración avanzada, por lo que se debe habilitar previamente la configuración show advanced options.A continuación se detallan:
  • min server memory. En MB. Permite garantizar un mínimo de memoria RAM para la Instancia de SQL Server. Sin embargo, se debe tener en cuenta, que SQL Server cuando se inicia no tomará toda la memoria RAM que indiquemos en éste valor. Como siempre, SQL Server tomará la memoria según le sea necesario. Eso sí, en caso de alcanzar o superar el valor especificado por min server memory, SQL Server garantiza que no liberá la memoria a valores inferiores del umbral que aquí establezcamos. Es decir, que tampoco vale pa mucho ;-)
  • max server memory. En MB. Permite establecer un límite superior de la memoria RAM que la Instancia de SQL Server puede llegar a utilizar. SQL Server se iniciará consumiendo la menor cantidad de memoria RAM posible, y con la actividad que ocurra en el sistema, empezará a ocupar memoria según la necesite, alcanzando como mucho el valor que establezcamos en esta propiedad. Un caso de uso típico, es tener múltiples instancias de SQL Server en una misma máquina, pudiendo limitar la memoria RAM de cada Instancia para evitar guerra de recursos.
A continuación se muestra un ejemplo de configuración de max server memory a 300 MB:
EXEC sp_configure 'show advanced options', '1';
GO

EXEC sp_configure 'max server memory (MB)', '300';
GO

RECONFIGURE WITH OVERRIDE;
GO

EXEC sp_configure 'show advanced options', '0';
GO

Comentarios

Entradas populares de este blog

¿En qué puerto TCP escucha SQL Server 2005? ¿Cómo cambiar o configurar el puerto TCP de escucha de una Instancia de SQL Server 2005?

Una buena práctica inmediatamente después de instalar SQL Server 2005 es cambiar el Puerto TCP de escucha, por múltiples motivos: Seguridad, Configuración de reglas de acceso de Firewall, Aplicaciones cliente que requieren un puerto TCP estático para SQL Server, etc. En este Artículo se explica cómo averiguar en qué puerto TCP escucha SQL Server 2005, cómo cambiar el puerto TCP de escucha de SQL Server 2005, etc. Resulta de gran interés ser capaz de responder a la pregunta  ¿En qué puerto TCP escucha SQL Server?  Por defecto, una  Instancia por Defecto de SQL Server 2005  queda configurada durante la instalación para escuchar en el  puerto TCP-1433 , sin embargo,  las Instancias con Nombre  quedan configuradas durante el proceso de instalación para escuchar en  puertos TCP dinámicos , por lo tanto, cada vez que se inicie la Instancia puede que escuche en un puerto diferente. Esta situación puede resultar problemática, por un lado desde el punto de vista de la seguridad (el hecho d

¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

Esta capítulo explica qué es el nivel de aislamiento (isolation level) de una transacción, el comportamiento de SQL Server en operaciones de lectura o de escritura, se detallan los diferentes niveles de aislamiento basados en bloqueos (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y los niveles de aislamiento basados en versionado de filas (READ COMMITTED SNAPSHOT, SNAPSHOT), se explican los males de la concurrencia (lecturas sucias, lecturas no repetibles, lecturas fantasma, y conflictos de actualización), como establecer el nivel de aislamiento deseado (SET TRANSACTION ISOLATION LEVEL y las opciones de base de datos READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION), cómo conecer el tiempo máximo de bloqueo (@@LOCK_TIMEOUT) y como establecer el tiempo máximo de bloqueo (SET LOCK_TIMEOUT), etc. El nivel de aislamiento de una transacción (transaction isolation level)  define el grado en que se aísla una transacción de las modificaciones de recursos o datos rea

Aumentar y Reducir la TempDB en SQL Server?

Una buena práctica después de instalar SQL Server (y que interesa revisar periódicamente) es tener bien dimensionada la base de datos TEMPDB, es decir que el  tamaño inicial de TEMPDB  sea suficiente, y en consecuencia no sea necesario que TEMPDB crezca ni tampoco reducir TEMPDB (SHRINK). Esta artículo explica brevemente  para qué sirve TEMPDB , explica camo cambiar el tamaño inicial de TEMPDB (aumentar o reducir),  cómo reducir TEMPDB , cuántos ficheros son recomendables para TEMPDB, etc. ¿Para qué sirve TEMPDB?  La base de datos TEMPDB es un elemento de gran importancia en una Instancia de SQL Server, ya que  TEMPDB es la encargada de almacenar tanto los objetos temporales  (tablas temporales, procedimientos almacenados temporales, etc.),  como los resultados intermedios  que pueda necesitar crear el motor de base de datos, por ejemplo durante la ejecución de consultas que utilizan las cláusulas GROUP BY, ORDER BY, DISTINCT, etc. (es decir, las tablas temporales o WorkTables que