Array
(
)

Utilização Excessiva de Memória Pelo SQL Server

Marciapw
   - 10 nov 2004

Olá pessoal. Gostaria de saber se alguém já enfrentou algum problema com relação a grande quantidade de memória que o SQL Server aloca durante a execução de queries.

Tenho um grande problema na empresa onde trabalho. Nosso sistema roda em ambiente Web, utilizando o SQL Server como banco de dados. Muitas queries (algumas delas bem pesadas) são executadas por vários usuários ao mesmo tempo.

O que tenho percebido é que o executável do SQL vai consumindo mais e mais memória a cada vez em que os usuários vão requisitando as queries pelo sistema - e o que mais me intriga é o fato dele não liberar essa memória após o término das execuções. É como se o SQL Server sempre consumisse toda a memória disponível, mas nunca a liberasse posteriormente, mesmo não estando mais a utilizá-la.

Como rotina nada saudável, temos stopado e startado o serviço do SQL sempre que percebemos que a memória do servidor está extremamente alta, pois quando isso acontece a lentidão no sistema é muito grande, o que impacta no trabalho dos usuários. Essa atividade me incomoda muito, pois temos sempre que estar de olho em quando parar a atividade de todos os usuários pra stopar o serviço, por vezes o serviço não stopa e starta novamente (aí só mesmo o boot no servidor resolve)... é muito desconforto.

Já vi alguns comentários pela Internet dizendo que o SQL faz isso mesmo... mas nunca ninguém trata isso como se fosse algo problemático, e por conseqüência fala sobre uma possível solução para o problema do ´acúmulo´ de memória por parte dele. Eu tentei ao máximo otimizar as queries, criar índices necessários para que o esforço do servidor diminuisse, mas isso pouco adiantou.

Alguém tem alguma idéia sobre o que fazer nesses casos? Seria esse um grande problema que a Microsoft ainda não soube enfrentar com relação ao SQL Server ou ao próprio sistema operacional? (usamos Windows 2000 Server). O que mais eu poderia fazer?

Abraços

Marcus.magalhaes
   - 10 nov 2004

Boa noite Marcia.

Vamos por partes.

1) O SQL Server realmente sempre aloca memória e não devolve, à menos que o sistema operacional requisite e isso acontece quando o SO vai começar a paginar, assim o SQL começa a devolver a memória pouco a pouco.

2) Se o seu servidor de banco de dados estiver sendo compartilhado com aplicações, isso é terrível pq a forma de trabalho do servidor de bd é completamente diferente da forma de trabalho de um servidor de aplicações, procure sempre manter o bd sozinho.

3) Se vc quer limitar a quantidade de memória que o SQL Server consome, vá no EM (Enterprise Manager), clique com o botão direito no nome da instância desejada, vá em memória e configure o mínimo e o máximo que ele poderá utilizar, assim o SQL Server nunca irá alocar mais do que o determinado.

4) Se vc quer que o SQL Server devolva memória sem precisar fazer o stop/start, execute o procedimento anterior e depois entre novamente em propriedades e recoloque em modo automático, assim ele devolve memória sem precisar parar ninguém.

5) Via performance monitor, procure monitor o object Buffer Cache e selecione Cache Hit Ratio, este indicador DEVE SEMPRE estar acima de 85¬ (no mínimo).

6) Procure fazer uma manutenção semanal das suas bases de dados, utilize o maintenance plan para criar rotinas de otimização (irá regerar os índices, mantendo-os sempre atualizados, e redistribuir as páginas de modo que a B-TREE continue balanceada), verificação de integridade (verifica se suas bases de dados estão integras lógica e fisicamente) e suas rotinas de backup tb podem ser agendadas por ali.

Espero ter ajudado.

Att,

Tremonti
   - 26 fev 2008

No item 4

4) Se vc quer que o SQL Server devolva memória sem precisar fazer o stop/start, execute o procedimento anterior e depois entre novamente em propriedades e recoloque em modo automático, assim ele devolve memória sem precisar parar ninguém

Como faço para deixar isso em modo automático, pois ele nao esta devolvendo a memória...