Utilização Excessiva de Memória Pelo SQL Server
10/11/2004
0
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
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
Marciapw
Curtir tópico
+ 0
Responder
Posts
10/11/2004
Marcus.magalhaes
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 [b:83e83f5528]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[/b:83e83f5528].
4) Se vc quer que o SQL Server devolva memória [b:83e83f5528]sem precisar fazer o stop/start[/b:83e83f5528], 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 [b:83e83f5528]Buffer Cache [/b:83e83f5528]e selecione [b:83e83f5528]Cache Hit Ratio[/b:83e83f5528], este indicador [b:83e83f5528][color=red:83e83f5528]DEVE SEMPRE estar acima de 85¬ (no mínimo).[/color:83e83f5528][/b:83e83f5528]
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,
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 [b:83e83f5528]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[/b:83e83f5528].
4) Se vc quer que o SQL Server devolva memória [b:83e83f5528]sem precisar fazer o stop/start[/b:83e83f5528], 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 [b:83e83f5528]Buffer Cache [/b:83e83f5528]e selecione [b:83e83f5528]Cache Hit Ratio[/b:83e83f5528], este indicador [b:83e83f5528][color=red:83e83f5528]DEVE SEMPRE estar acima de 85¬ (no mínimo).[/color:83e83f5528][/b:83e83f5528]
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,
Responder
26/02/2008
Tremonti
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...
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...
Responder
Clique aqui para fazer login e interagir na Comunidade :)