Preparar:
- Windows Server 2008 R2
- SQL Server 2008 R2 SP1
- 240 GB de RAM
- TempDB son archivos de datos de 8x16 GB sin crecimiento automático (128 GB en total)
- Servidor físico / independiente
Este servidor se utiliza para el procesamiento de ETL. Acabamos de instalar más RAM en este servidor para un total de 240 GB de RAM. Los servicios de SQL Server son las únicas cosas reales en ejecución.
La memoria se muestra bien en el BIOS, OpenManage y Windows.
Si configuro SQL Server para usar una memoria mínima / máxima de 70 / 100GB, no tenemos problemas. Sin embargo, una vez que aumento eso a 120 / 150GB, obtengo el siguiente error cuando ejecuto uno de nuestros procesos ETL:
No se pudo asignar espacio para el objeto '<objeto del sistema temporal: 422234507706368>' en la base de datos 'tempdb' porque el grupo de archivos 'PRIMARIO' está lleno. Cree espacio en disco eliminando archivos innecesarios, colocando objetos en el grupo de archivos, agregando archivos adicionales al grupo de archivos o configurando el crecimiento automático para los archivos existentes en el grupo de archivos. (Mensaje 1105, Estado 2, Procedimiento desconocido, Línea 1)
Nunca nos hemos encontrado con este problema antes de cambiar la configuración de la memoria. Después de reconfigurar nuevamente a los 70 / 100GB originales, no recibimos este error.
Cosas que he probado:
- Establezca los archivos de datos TempDB para crecer automáticamente. Esto simplemente hace que los archivos crezcan automáticamente hasta que se alcanza la capacidad del disco y luego falla.
- Agregue más archivos de datos TempDB. El mismo error que se muestra.
- Aumente el tamaño de TempDB a 8x32GB (256GB en total)
No sé qué podría estar causando este problema.
fuente
Respuestas:
Gracias a todos por vuestra ayuda.
Después de analizar algunos planes de ejecución, resulta que hay una UNIÓN que se procesa de manera diferente en función de la cantidad de RAM disponible. Con menos RAM lo evalúa con un Hash; con más RAM, usa una serie de Merge Joins.
Básicamente, todo se redujo a T-SQL mal escrito, que actualmente estoy refactorizando.
fuente
Esta no es una respuesta a la pregunta, solo un código que no quería publicar en un comentario. Para ver el equilibrio de sus planificadores y memoria en los nodos NUMA (y también para ver si alguno de los nodos no está visible en línea):
(En SQL Server 2012, lo último
SUM
debería serSUM(pages_kb)
porque ya no hay asignadores separados de una o varias páginas).fuente