it-swarm-pt.tech

Recuperando memória do SQL Server

Eu tenho uma instância do SQL Server cujo uso de memória aumenta gradualmente até que o Windows não dê mais. Parece lógico que o resultado ocasional de uma grande consulta faria com que a instância aumentasse.

Existe uma maneira de convencer o SQL Server a liberar a memória de que ele 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) + ')'
10
BIBD

Então, para resumir as respostas:

Não há como 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ê estiver tendo problemas de memória, deve reduzir o valor da opção de memória "memória máxima do servidor".

4
BIBD

É exatamente assim que o SQL Server deve funcionar.

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

19
Portman

Os outros pôsteres estão corretos ao dizer que isso é intencional, mas você absolutamente deseja limitar a memória máxima a um pouco menos do que a RAM do servidor. Pense sobre esta sequência de eventos:

  • SQL 2000 funciona bem, consumindo toda a RAM do seu servidor
  • Alguém está fazendo RDPs, ou você tem que puxar IE para baixar um patch, ou seus backups começam, qualquer coisa
  • SQL tem que desalocar e liberar memória suficiente para o sistema operacional funcionar
  • O desempenho é péssimo ao liberar memória e paginar para o disco
  • As coisas vão bem quando estiver estável
  • A outra operação é concluída e o SQL gradualmente recupera a RAM liberada
  • Repetir

Para evitar isso, configure o limite máximo de memória do servidor para algo em torno de 80-90% de sua memória física real. Instruções para SQL 2000 em: http://msdn.Microsoft.com/en-us/library/ms178067.aspx

8
sh-beta

Ele só irá liberá-lo se o sistema operacional sinalizar que está RAM inanimado, ou se você parar e reiniciar o serviço; a coisa a fazer é limitar a quantidade máxima que o SQL usará configurando o 'max valor da memória do servidor '. Se não houver mais nada no servidor que precise do RAM (e espero que não haja), eu não me preocuparia com isso.

4
SqlACID

O SQL Server consumirá memória e não a devolverá, a menos que seja informado pelo sistema operacional de que há pressão de memória. Como Portman indicou, isso é intencional e, se você quiser limitar o consumo de memória, precisará definir a memória máxima do servidor que o SQL Server usará.

3
K. Brian Kelley

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 anteriores, uma vez que ele consiga memória, ele não a devolverá, não importa o quanto o sistema operacional peça por isso.

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

2
Paul Randal

Pergunta antiga, eu sei, mas uma maneira de forçar (pelo menos os mais novos) o SQL a liberar memória é escrever um aplicativo alocando o máximo de memória possível em blocos, esperando por (digamos) 15 segundos (por exemplo, Sleep (15000)) e a liberação da memória alocada e saída; Tentei fazer isso e o SQL libera a memória para que o sistema recupere sua 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, menos de 1024) e, em seguida, percorra a lista vinculada para liberar os blocos alocados

0
A Passer by