Configuração:
- Windows Server 2008 R2
- SQL Server 2008 R2 SP1
- 240GB RAM
- TempDB são arquivos de dados de 8x16GB sem crescimento automático (total de 128GB)
- Servidor Físico / Independente
Este servidor é usado para processamento ETL. Acabamos de instalar mais RAM neste servidor, totalizando 240 GB de RAM. Os serviços do SQL Server são as únicas coisas reais em execução.
A memória aparece bem no BIOS, OpenManage e Windows.
Se eu configurar o SQL Server para usar um mínimo / máximo de 70 / 100GB de memória, não haverá problemas. No entanto, depois que eu aumentar para 120 / 150GB, recebo o seguinte erro ao executar um dos nossos processos ETL:
Não foi possível alocar espaço para o objeto '<objeto temporário do sistema: 422234507706368>' no banco de dados 'tempdb' porque o grupo de arquivos 'PRIMARY' está cheio. Crie espaço em disco excluindo arquivos desnecessários, descartando objetos no grupo de arquivos, adicionando arquivos adicionais ao grupo de arquivos ou configurando o crescimento automático para arquivos existentes no grupo de arquivos. (Mensagem 1105, estado 2, procedimento desconhecido, linha 1)
Nunca encontramos esse problema antes de alterar a configuração da memória. Depois de reconfigurar o original para 70 / 100GB, não recebemos esse erro.
Coisas que tentei:
- Defina os arquivos de dados TempDB para crescimento automático. Isso simplesmente resulta no crescimento automático dos arquivos até que a capacidade do disco seja atingida e falhe.
- Adicione mais arquivos de dados TempDB. Mesmo erro que o mostrado.
- Aumente o tamanho do TempDB para 8x32GB (total de 256GB)
Estou sem saber o que poderia estar causando esse problema.
fonte
Respostas:
Obrigado a todos por sua ajuda.
Após analisar alguns planos de execução, verifica-se que um JOIN está sendo processado de maneira diferente com base na quantidade de RAM disponível. Com menos RAM, ele é avaliado com um Hash; com mais RAM, ele usa uma série de junções de mesclagem.
Então, basicamente, tudo se resumiu ao T-SQL mal escrito, que estou refatorando atualmente.
fonte
Esta não é uma resposta para a pergunta, apenas um código que eu não queria postar em um comentário. Para ver o equilíbrio de seus agendadores e memória nos nós NUMA (e também para ver se algum nó não está visível online):
(No SQL Server 2012, o último
SUM
deve ser,SUM(pages_kb)
pois não há mais alocadores separados de uma e várias páginas.)fonte