Recuperando Memória do SQL Server

10

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

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

Respostas:

19

É exatamente assim que o SQL Server deve funcionar.

Se você possui outros serviços nessa máquina e não deseja 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.

Portman
fonte
1
Parece mais um bug do que um recurso ... está acontecendo comigo. O SQL Server ocupa 95% da RAM disponível para fazer alguma coisa e falha ao liberá-la quando estiver concluída.
alquímico
1
@ Alquímico Depende do que você quer dizer com " completo ". O SQL Server pode usar toda a RAM do computador; usando-o como um cache de disco. Ele não " conclui " o uso como cache de disco até você terminar de usar o SQL Server.
11113 Ian Boyd
8

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

  • O SQL 2000 é executado com êxito, consumindo toda a RAM do servidor
  • Alguém faz RDPs ou você precisa acessar o IE para baixar um patch, ou seus backups começam, qualquer que seja
  • O SQL precisa desalocar e liberar memória suficiente para o sistema operacional funcionar
  • O desempenho é péssimo ao liberar memória e paginar no disco
  • As coisas vão 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: http://msdn.microsoft.com/en-us/library/ms178067.aspx

sh-beta
fonte
Lembre-se de que esse comportamento é 2005 e 2008 - 2000 não libera memória sob demanda para o sistema operacional.
Paul Randal
2
Não exatamente sob demanda, mas libera memória de volta para o sistema operacional. No link que eu postei: "Quando o SQL Server está usando memória dinamicamente, ele consulta o sistema periodicamente para determinar a quantidade de memória física livre. No Microsoft Windows 2000, o SQL Server aumenta ou diminui o cache do buffer para manter a memória física livre entre 4 MB e 10 MB, dependendo da atividade do servidor. Manter essa memória livre evita a paginação do Windows 2000. Se houver menos memória livre, o SQL Server libera memória para o Windows 2000. Se houver mais memória livre, o SQL Server alocará memória para o buffer pool. "
Sh-beta
Ah - é verdade - ele faz o truque de desmantelar um pouco de memória física - você está certo!
2113 Paul Randal
4

Ele será liberado apenas se o sistema operacional sinalizar que está com falta de memória RAM ou se você parar e reiniciar o serviço; o que se deve fazer é limitar a quantidade máxima que o SQL usará configurando o valor 'max server memory'. Se não houver mais nada no servidor que precise da RAM (e espero que não exista), não me preocuparia.

SqlACID
fonte
4

Então, para resumir as respostas:

Não há como solicitar ao MS SQL Server que libere memória que não é necessária imediatamente. O SQL Server deve liberar memória automaticamente quando necessário, mas não antes disso. E se você estiver com problemas de memória, reduza o valor da opção de memória "max server memory".

BIBD
fonte
3

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

K. Brian Kelley
fonte
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 sistema operacional.

Para o SQL Server 2000 e versões anteriores, uma vez que ele agarra a memória, não a devolve, não importa o quanto o SO grite.

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

Paul Randal
fonte
Ah ha ... sim, de fato, SQL 2000.
BIBD 6/09/09
3
Não o devolve quando o SO grita por isso, mas devolve se vê que o SO está abaixo de um determinado limite para a memória física livre. Consulte msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta
E para reforçar o que o sh-beta disse, o SQL Server 2000 somente libera memória quando percebe que o sistema operacional está com pouca memória física, porque foi somente no Windows XP (2001) que o Windows adicionou uma API para permitir que " o sistema operacional gritasse por" it "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). O SQL Server 2005 tira proveito desse novo recurso do Windows. Mas quando o SQL Server 2000 foi gravado, não havia como o sistema operacional gritar por ele, forçando o SQL Server a verificar periodicamente a pressão da memória.
11268 Ian Ian Boyd
0

Pergunta antiga, eu sei, mas uma maneira de forçar o SQL (mais novo, pelo menos) a liberar memória é escrever um aplicativo que aloca o máximo de memória possível em pedaços, esperando por (digamos) 15 segundos (por exemplo, suspensão (15000)) e liberando a memória alocada e saindo; Eu tentei 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 estruturas 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 de volta os blocos alocados

Um transeunte
fonte