Configurar:
- Windows Server 2008 R2
- SQL Server 2008 R2 SP1
- RAM de 240 GB
- TempDB é 8x16GB de arquivos de dados sem crescimento automático (total de 128GB)
- Servidor Físico/Autônomo
Este servidor é usado para processamento de ETL. Acabamos de instalar mais RAM neste servidor para um total de 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/100 GB de memória, não teremos problemas. No entanto, depois de aumentar para 120/150 GB, recebo o seguinte erro ao executar um de nossos processos ETL:
Não foi possível alocar espaço para o objeto '<objeto de sistema temporário: 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 definindo o crescimento automático para arquivos existentes no grupo de arquivos. (Msg 1105, Estado 2, Procedimento Desconhecido, Linha 1)
Nunca nos deparamos com esse problema antes de alterar a configuração da memória. Depois de reconfigurar de volta para os 70/100 GB originais, não recebemos esse erro.
Coisas que eu 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, em seguida, falha.
- Adicione mais arquivos de dados TempDB. Mesmo erro mostrado.
- Aumente o tamanho do TempDB para 8x32 GB (total de 256 GB)
Estou sem saber o que pode estar causando esse problema.
Obrigado a todos por sua ajuda.
Depois de passar por alguns planos de execução, descobri que existe um JOIN que está sendo processado de maneira diferente com base na quantidade de RAM disponível. Com menos RAM ele avalia com um Hash; com mais RAM, ele usa uma série de Merge Joins.
Basicamente, tudo se resumia a um T-SQL mal escrito, que estou refatorando no momento.
Esta não é uma resposta para a pergunta, apenas algum código que 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 serSUM(pages_kb)
, pois não há mais alocadores separados de página única e múltipla.)