Recuperando memória do SQL Server

10

Eu tenho uma instância do SQL Server cujo uso de memória cresce gradualmente até que o Windows não apresente mais. Parece lógico que o resultado da consulta grande ocasionaria o crescimento da instância.

Existe alguma maneira de convencer o SQL Server a liberar a memória de que não precisa mais (além de reiniciar o serviço)?

Editar:
Estou usando o SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)

Consegui descobrir isso usando a seguinte consulta:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
    
por BIBD 30.04.2009 / 18:59

7 respostas

4

Então, para resumir as respostas:

Não há nenhuma maneira de solicitar ao MS SQL Server para liberar memória de que não precisa imediatamente. O SQL Server deve liberar memória automaticamente quando necessário, mas não antes disso. E se você está tendo problemas de memória, você deve reduzir o valor da otimização da memória "max server memory".

    
por 03.06.2009 / 17:37
18

É exatamente assim que o suposto SQL Server funcionará.

Se você tiver outros serviços nessa máquina e não quiser que o SQL consuma toda a memória disponível, precisará definir a memória máxima do servidor. Consulte Opções de memória do SQL Server no MSDN.

    
por 30.04.2009 / 19:04
8

Os outros cartazes estão corretos que isso é por design, mas você absolutamente deseja limitar o máximo de memória para um pouco menos que a RAM do seu servidor. Pense nessa sequência de eventos:

  • O SQL 2000 roda feliz, consumindo toda a RAM do seu servidor
  • Alguém RDPs, ou você tem que puxar o IE para baixar um patch, ou seus backups iniciados, o que for
  • O SQL tem que desalocar e liberar memória suficiente para o sistema operacional funcionar
  • O desempenho é insuficiente ao liberar memória e paginar para o disco
  • As coisas correm bem quando é estável
  • A outra operação é concluída e o SQL recupera gradualmente a RAM liberada
  • Repetir

Para evitar isso, configure o limite máximo de memória do servidor para algo em torno de 80 a 90% da memória física real. Instruções para o SQL 2000 em: link

    
por 06.05.2009 / 16:49
4

Ele só será liberado se o sistema operacional indicar que a RAM está com problemas de RAM ou se você parar e reiniciar o serviço; A única coisa a fazer é limitar o valor máximo que o SQL usará configurando o valor de 'memória máxima do servidor'. Se não há mais nada no servidor que precisa da RAM (e espero que não haja) eu não me preocuparia com isso.

    
por 30.04.2009 / 19:06
3

O SQL Server consumirá memória e não a devolverá a menos que seja informado pelo sistema operacional que existe pressão de memória. Como Portman indicou, isso ocorre por padrão e, se você deseja limitar o consumo de memória, é necessário definir a memória máxima do servidor que o SQL Server usará.

    
por 30.04.2009 / 19:06
2

Lembre-se de que o comportamento que você está descrevendo é do SQL Server 2005 em diante, quando o gerenciador de memória foi reescrito para (entre outras coisas) responder às solicitações de pressão de memória do SO.

Para o SQL Server 2000 e anterior, uma vez que ele consiga memória, ele não o devolverá, não importa o quanto o sistema operacional exija.

CodeSlave - você está rodando em 2000, 2005 ou 2008?

    
por 06.05.2009 / 15:21
0

Pergunta antiga, eu sei, mas uma maneira de forçar (mais recente, pelo menos) o SQL a liberar memória é escrever um aplicativo alocando tanta memória quanto possível em pedaços, esperando (digamos) 15 segundos (por exemplo, Sleep ( 15000)) e liberando a memória alocada e saindo; Eu tentei isso e SQL libera a memória para que o sistema receba de volta sua memória RAM; escrever código como o acima é quase trivial usando C / C ++, apenas uma questão de configurar uma cadeia de stucts para manter a cadeia de blocos de memória (ponteiro e tamanho), reduzir progressivamente o tamanho quando um "malloc ()" falhar até atingir um mínimo (digamos, menor que 1024) e, em seguida, percorrer a lista vinculada para liberar os blocos alocados

    
por 02.07.2015 / 11:49