Pode não haver memória virtual quando você tem um grande número de bancos de dados no SQL Server

Traduções deste artigo Traduções deste artigo
ID do artigo: 316749 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Pode não haver espaço suficiente disponível de endereço virtual no processo do Microsoft SQL Server se todas as condições a seguir forem verdadeiras, quando você está executando SQL Server com o padrão valores de configuração:
  • O servidor tem 2 GB ou mais de RAM.
  • Há um grande número de bancos de dados no sistema (por exemplo, mais de 500).
  • A maioria dos bancos de dados é atualizada (por exemplo, os bancos de dados não são preciso um status "somente leitura").
  • Há suficiente conexões de usuários simultaneamente ativos ao usar a maioria dos threads de trabalho 255 do SQL Server.
SQL Server pode gerar os seguintes mensagens de erro após o espaço de endereço virtual inteiros de 2 GB é usado (ou após o espaço de endereço virtual inteiros de 3 GB é usado no SQL Server Enterprise Edition com o / 3 GB alternar no arquivo Boot.ini).

Mensagem 1

Erro: 17802, gravidade: 18, estado: 3
Não foi possível criar segmento de evento do servidor.

Mensagem 2

SQL Server não foi possível gerar process_loginread thread.

Mensagem 3

Aviso: Limpar o cache de procedimento para liberar memória contígua.

Distribuição de buffer: Roubado = 3454 livre = 2540 procedimentos = 138
Inram = 0 = sujo 1108 mantidos = 35
Eu / O = 0, travadas = 0, outros = 214821
Confirmação de contagens de buffer: = Destino 222096 = 222096 com = 215964
InternalReservation = ExternalReservation 547 = 0 mínimo livre = 512
Cache de procedimento: TotalProcs = 8 TotalPages = 138 InUsePages = 138
Gerenciador de memória dinâmica: roubado = 3556
Sistema operacional = geral 497 = 1706
Plano de consulta = otimizador 755 = 0
Utilitários = conexão 9 = 1583
Recursos de objetos de memória global: = 1119 bloqueios = 163 XDES = 1 SQLCache = 90 replicação = 5 LockBytes = ServerGlobal 2 = 20
Gerenciador de memória de consulta: concede = espera 0 = 0 máximo = 164370 disponíveis = 164370

Causa

Para cada banco de dados atualizado, SQL Server aloca pelo menos um bloco de 64 KB para uso em formatação registros de log antes de eles são gravados em disco. Essa alocação ocorre quando o primeiro registro de log é gerado para o banco de dados, como durante uma instrução INSERT, UPDATE ou DELETE. Dependendo da atividade e o tamanho dos registros de log gerado, modificações subseqüentes podem disparar a alocação de alocações de 64 KB adicionais. SQL Server 7.0 irá alocar mais de três blocos de 54 KB. No SQL Server 2000, o número superior de alocações para cada banco de dados é uma função do número de processadores que SQL Server é configurado para usar.

Como Contornar

Use o -g parâmetro de inicialização para deixar adicional, não reservada virtual memória disponível para essas alocações de banco de dados. O -g parâmetro está documentado no Readme.txt do SQL Server 7.0 service pack e no Books Online do SQL Server 2000. O "Mais informações" seção deste artigo inclui as configurações que a Microsoft recomenda usar para determinar o valor apropriado para esta configuração.

Mais Informações

Em um computador com 2 GB ou mais de RAM, SQL Server reserva todos os mas 256 MB (SQL Server 7.0) ou 384 MB (SQL Server 2000) de espaço de endereço virtual durante o processo de inicialização para uso por pool de buffer. Além disso, para armazenar o cache de dados e de procedimento, SQL Server usa a memória de pool de buffer para atender a maioria das outras solicitações de memória de processos do SQL Server que são menores do que 8 KB. A memória não reservada restante se destina a uso com outras alocações que não podem ser atendidas do pool de buffers. Essas alocações incluem, mas não estão limitadas a:
  • O bloco de ambiente thread associado para qualquer segmentos que o SQL Server cria e pilhas. Depois que o SQL Server cria todos os threads de trabalho 255, isso é de aproximadamente 140 MB.
  • Alocações que são feitas por outras DLLs ou processos que estiverem executando no espaço de endereço do SQL Server (que varia de sistema), como:
    • Provedores OLE DB de quaisquer servidores vinculados.
    • Objetos COM que são carregados pelo uso do sistema sp_OA procedimentos armazenados ou procedimentos armazenados estendidos.
  • Qualquer imagem (.exe ou .dll) que é carregadas no espaço de endereço, que normalmente usar 20 a 25 MB, mas possivelmente mais se você estiver usando servidores vinculados, sp_OA , ou estendida procedimentos armazenados.
  • O heap de processo e qualquer outros heaps SQL Server pode criar. Durante o processo de inicialização, isso normalmente é 10 MB, mas pode ser mais se você estiver usando servidores vinculados, sp_OA ou procedimentos armazenados estendidos.
  • Alocações de processos do SQL Server que são maiores do que 8 KB, tais como aquelas necessárias para planos de consulta grande, enviar e receber buffers se a opção de configuração tamanho do pacote de rede é próximo 8 KB e assim por diante. Para ver esse número, procure o valor Reservados do sistema operacional que é relatado no DBCC MEMORYSTATUS e o que for reportado como número de páginas de 8 KB. Os valores típicos para isso são 5 MB.
  • Uma matriz para rastrear informações de status para cada buffer que está no pool de buffer. Esse geralmente é cerca de 20 MB, a menos que SQL Server está executando com o endereço janela Extensions (AWE) habilitado, caso em que podem ser significativamente maior.
Em sistemas que têm um grande número de bancos de dados, as alocações de 64 KB são necessárias para log formatação podem ocupar toda a memória virtual restante. Nesse ponto, alocações subseqüentes podem falhar, resultando em um ou mais dos erros que estão listados na "Sintomas" seção neste artigo.

Usando o -g parâmetro de inicialização, você pode instruir o SQL Server para deixar memória virtual adicional disponível para que a combinação dessas alocações de log e outras alocações normais não é executado sem espaço de endereço virtual.

A tabela a seguir listas alguns sugeridos ponto de partida para o -g valor dependendo o número de bancos de dados e a versão do servidor:
Recolher esta tabelaExpandir esta tabela
Bancos de dadosSQL Server 7.0SQL Server 2000
250-g134 N/D
500-g185 N/D
750-g237 N/D
1000-g288 -g288
1250-g340 -g340
1500-g392 -g392
Esta tabela foi calculada usando os valores comuns são listados e ele também é baseado na suposição de que nenhuma atividade de servidor vinculado, sp_OA ou procedimentos armazenados estendidos estão em uso. Também é baseada na suposição de que você não estiver usando AWE, e que o SQL Profiler não está em uso. Qualquer uma dessas condições pode ser necessário aumentar o valor de -g .

A Microsoft recomenda que você tomar consideração séria antes de executar um servidor com mais bancos de dados que isso porque a sobrecarga necessária para ter esse número de bancos de dados no sistema está demorando muita memória virtual fora do pool de buffer, que pode resultar em um desempenho ruim para o sistema como um todo.

Além disso, criar muitos bancos de dados tem o efeito mais significativo em memória virtual. Também há alocações de memória por banco de dados que podem causar uma condição de falta de memória de pool de buffer. Por exemplo, você receberá a seguinte mensagem de erro:
Erro: 701, gravidade: 17, estado: 123.
Não há memória do sistema insuficiente para executar essa consulta.
Esse tipo de condição de falta de memória talvez seja mais comuns no SQL Server 2005 porque o SQL Server 2005 controla mais metadados por banco de dados que as versões anteriores do SQL Server.

Quando você controlar o uso do índice usando o procedimento sys.dm_db_index_usage_stats armazenado, a operação pode exigem uma quantidade significativa de memória. A operação requer uma quantidade significativa de memória se cada banco de dados tiver muita índices.

Propriedades

ID do artigo: 316749 - Última revisão: quarta-feira, 28 de fevereiro de 2007 - Revisão: 11.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
Palavras-chave: 
kbmt kberrmsg kbtshoot kbnofix kbprb KB316749 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316749

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com