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) + ')'
memory
sql-server
BIBD
fonte
fonte
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:
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
fonte
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.
fonte
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".
fonte
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á.
fonte
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?
fonte
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
fonte