it-swarm-es.com

Recuperar memoria de SQL Server

Tengo una instancia de SQL Server cuyo uso de memoria crece gradualmente hasta que Windows no le da más. Parece lógico que el resultado de una gran consulta ocasional haga que la instancia crezca.

¿Hay alguna manera de convencer a SQL Server de 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) + ')'
10
BIBD

Entonces, para resumir las respuestas:

No hay forma de solicitar a MS SQL Server que libere la memoria que no necesita de inmediato. SQL Server debería liberar memoria automáticamente 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".

4
BIBD

Así es exactamente como se supone que SQL Server funciona.

Si tiene otros servicios en esa máquina y no desea que SQL consuma toda la memoria disponible, deberá establecer la memoria máxima del servidor. Consulte Opciones de memoria de SQL Server en MSDN.

19
Portman

Los otros carteles tienen razón en que esto es por diseño, pero absolutamente desea limitar la memoria máxima a un poco menos que la RAM de su servidor. Piense en esta secuencia de eventos:

  • SQL 2000 se ejecuta felizmente, consumiendo toda la RAM de su servidor
  • Alguien ingresa RDP, o tienes que tirar hacia arriba IE para descargar un parche, o tus copias de seguridad comienzan, lo que sea
  • SQL tiene que desasignar y liberar suficiente memoria para que el sistema operativo funcione
  • El rendimiento apesta mientras libera memoria y pagina al disco
  • Las cosas van lo suficientemente bien una vez que está estable
  • La otra operación se completa y SQL recupera gradualmente la RAM liberada
  • Repetir

Para evitar esto, configure el límite máximo de memoria del servidor en alrededor del 80-90% de su memoria física real. Instrucciones para SQL 2000 en: http://msdn.Microsoft.com/en-us/library/ms178067.aspx

8
sh-beta

Solo lo lanzará si el sistema operativo indica que está RAM hambriento, o si detiene y reinicia el servicio; lo que debe hacer es limitar la cantidad máxima que SQL usará configurando el 'max valor de la memoria del servidor. Si no hay nada más en el servidor que necesite RAM (y con suerte no lo hay), no me preocuparía por eso.

4
SqlACID

SQL Server consumirá memoria y no la devolverá a menos que el sistema operativo le indique que hay presión de memoria. Como ha indicado Portman, 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.

3
K. Brian Kelley

Recuerde que el comportamiento que todos están describiendo es desde SQL Server 2005 en adelante, cuando se reescribió el administrador de memoria 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 memoria, no la devolverá, sin importar cuánto el sistema operativo lo pida.

CodeSlave: ¿se está ejecutando en 2000, 2005 o 2008?

2
Paul Randal

Pregunta antigua, lo sé, pero una forma de forzar (más nuevo, al menos) SQL a liberar memoria es escribir una aplicación que asigne tanta memoria como pueda en fragmentos, esperando (digamos) 15 segundos (por ejemplo, Sleep (15000)) y la liberación de la memoria asignada y la salida; Probé 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 estudios para contener la cadena de bloques de memoria (puntero y tamaño), reducir progresivamente el tamaño cuando un "malloc ()" falla hasta alcanzar un mínimo (digamos menos de 1024) y luego recorra la lista vinculada para liberar los bloques asignados

0
A Passer by