Tengo una instancia de SQL Server cuyo uso de memoria crece gradualmente hasta que Windows ya no le dé más. Parece lógico que el resultado de consultas grandes ocasionales haga que la instancia crezca.
¿Hay alguna manera de convencer a SQL Server para que libere la memoria que ya no necesita (aparte de reiniciar el servicio)?
Editar:
estoy usando SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)
Pude averiguarlo usando la siguiente consulta:
SELECT 'SQL Server '
+ CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - '
+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' ('
+ CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
memory
sql-server
BIBD
fuente
fuente
Los otros carteles están en lo cierto al decir que esto es así por diseño, pero desea limitar la memoria máxima a un poco menos que la RAM de su servidor. Piensa en esta secuencia de eventos:
Para evitar esto, configure el límite máximo de memoria del servidor en algo alrededor del 80-90% de su memoria física real. Instrucciones para SQL 2000 en: http://msdn.microsoft.com/en-us/library/ms178067.aspx
fuente
Solo lo liberará si el sistema operativo indica que no tiene RAM o si detiene y reinicia el servicio; lo que hay que hacer es limitar la cantidad máxima que SQL usará configurando el valor de "memoria máxima del servidor". Si no hay nada más en el servidor que necesite la RAM (y espero que no), no me preocuparía.
fuente
Entonces, para resumir las respuestas:
No hay forma de solicitar a MS SQL Server que libere memoria que no necesita de inmediato. SQL Server debería liberar automáticamente la memoria cuando sea necesario, pero no antes. Y si tiene problemas de memoria, debe reducir el valor de la opción de memoria "memoria máxima del servidor".
fuente
SQL Server consumirá memoria y no la devolverá a menos que el sistema operativo le indique que hay presión de memoria. Como Portman ha indicado, esto es por diseño, y si desea limitar el consumo de memoria, debe establecer la memoria máxima del servidor que utilizará SQL Server.
fuente
Recuerde que el comportamiento que está describiendo es a partir de SQL Server 2005 en adelante, cuando el administrador de memoria fue reescrito para (entre otras cosas) responder a las solicitudes de presión de memoria del sistema operativo.
Para SQL Server 2000 y versiones anteriores, una vez que toma la memoria, no la devolverá, sin importar cuánto grite el sistema operativo.
CodeSlave: ¿está ejecutando en 2000, 2005 o 2008?
fuente
Antigua pregunta, lo sé, pero una forma de forzar (al menos más reciente) SQL para liberar memoria es escribir una aplicación que asigne tanta memoria como sea posible en trozos, esperando (digamos) 15 segundos (por ejemplo, Suspensión (15000)) y liberar la memoria asignada y salir; Intenté esto y SQL libera la memoria para que el sistema recupere su RAM; escribir código como el anterior es casi trivial usando C / C ++, solo es cuestión de configurar una cadena de elementos para mantener la cadena de bloque de memoria (puntero y tamaño), reducir progresivamente el tamaño cuando un "malloc ()" falla hasta que alcanza un mínimo (digamos menos de 1024) y luego recorra la lista vinculada para liberar los bloques asignados
fuente