none
Consumo excesivo de memoria en sql RRS feed

  • Pregunta

  • Buenas tardes

    tengo un pequeña duda la cual es la siguiente,

    en nuestros servidores de sql tenemos 64gb de memoria y en los ultimos dias hemos notado que el sql consume 63gb lo que deseo saber es, si es recomendable especificarle al sql server un rango de memoria para el o permitirle que consuma la disponible en el servidor.

    y cual seria la repercusion de asignarle la memoria a consumir al sql server.

    Gracias.


    Dewars Barett

    lunes, 31 de octubre de 2016 19:16

Respuestas

  • Tienes que considerar qué más vas a ejecutar en ese servidor. Si es un servidor dedicado exclusivamente al motor de base de datos, entonces es normal permitirle que consuma casi toda la memoria del equipo. Hay que dejar libre la suficiente como para no "asfixiar" al sistema operativo, y para poder ejecutar herramientas administrativas si fuera necesario.

    ¿Cuánta memoria conviene dejar libre? Una recomendación popular es la de dejar 1GB para el sistema operativo, más 1GB por cada 4 GB de memoria instalada hasta 16GB, más 1 GB por cada 8 GB de memoria por encima de 16GB. Haciendo las cuentas, en tu caso resulta una reserva 8GB de memoria, con lo cual le configurarías al SQL Server un máximo de 56 GB. Después se debe monitorizar el comportamiento del servidor para ver si se le puede subir un poco más la asignación de memoria.

    Este es el artículo original:

    https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/

    • Marcado como respuesta jose02 lunes, 31 de octubre de 2016 20:57
    lunes, 31 de octubre de 2016 19:32
  • Si te esta consumiendo 63 Gb, lo mas adecuado es ver que es lo que está consumiendo tanta memoria, puede ser la TempDb, stored procedures mal hechas, abuso de tablas temporales, cursores, etc.  si restringes la memoria sin averiguar el problema lo mas probable es que tus sistemas se hagan mas lentos.  Un analisis utilizando profiler puede arrojar luces sobre el problema.

    Saludos

    • Marcado como respuesta jose02 lunes, 31 de octubre de 2016 20:57
    lunes, 31 de octubre de 2016 19:39

Todas las respuestas

  • Tienes que considerar qué más vas a ejecutar en ese servidor. Si es un servidor dedicado exclusivamente al motor de base de datos, entonces es normal permitirle que consuma casi toda la memoria del equipo. Hay que dejar libre la suficiente como para no "asfixiar" al sistema operativo, y para poder ejecutar herramientas administrativas si fuera necesario.

    ¿Cuánta memoria conviene dejar libre? Una recomendación popular es la de dejar 1GB para el sistema operativo, más 1GB por cada 4 GB de memoria instalada hasta 16GB, más 1 GB por cada 8 GB de memoria por encima de 16GB. Haciendo las cuentas, en tu caso resulta una reserva 8GB de memoria, con lo cual le configurarías al SQL Server un máximo de 56 GB. Después se debe monitorizar el comportamiento del servidor para ver si se le puede subir un poco más la asignación de memoria.

    Este es el artículo original:

    https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/

    • Marcado como respuesta jose02 lunes, 31 de octubre de 2016 20:57
    lunes, 31 de octubre de 2016 19:32
  • Si te esta consumiendo 63 Gb, lo mas adecuado es ver que es lo que está consumiendo tanta memoria, puede ser la TempDb, stored procedures mal hechas, abuso de tablas temporales, cursores, etc.  si restringes la memoria sin averiguar el problema lo mas probable es que tus sistemas se hagan mas lentos.  Un analisis utilizando profiler puede arrojar luces sobre el problema.

    Saludos

    • Marcado como respuesta jose02 lunes, 31 de octubre de 2016 20:57
    lunes, 31 de octubre de 2016 19:39
  • en ese sentido,

    para la generacion de cualquier reporte en la base de datos se genera un tabla fisica, por ejemplo desde la pc1 se genera un reporte y se crea un tabla con el nombre de la pc seguido del nombre del reporte, si el utilizado el profile en muchos casos las tablas no contienen llaves primarias, y los index que tienen son los que crea sql por defecto.

    lo que ando es buscando una forma de como poder optimizar los recurso, por que por otro lado esa base de datos fue desarrollada por otra persona y por tanto no me es posible modificar la base de datos.

    Quisiera saber alguna recomendacion que se pueda hacer.


    Dewars Barett

    lunes, 31 de octubre de 2016 20:13
  • Lo de generar una tabla por reporte puede tener otros inconvenientes, pero no es razón suficiente para que haya una ocupación excesiva de memoria. Cierto que las páginas ocupadas por cada tabla temporal se cargarán en el caché de buffers al emitir el reporte, pero una vez terminado éste esas páginas que ya no se usan serán "expulsadas" de memoria en el momento en el que esa memoria se necesite para cachear otros objetos de la base de datos.

    Es normal que esas tablas no tengan claves primarias. Si solo se van a usar para emitir un reporte, y se han generado correctamente con los registros necesarios para el reporte, el reporte saldrá a partir de un único barrido de la tabla completa, lo cual es perfectamente eficiente con un heap y no requiere ningún índice; es más, de hecho es más eficiente y requiere menos memoria que si tuviese clave primaria (que por defecto crearía un índice clustered). Otra cosa distinta sería una tabla con muchos datos de los que solo se van a usar unos pocos. En ese caso sí que sería conveniente que tuviese un índice que permitiese acceder directamente solo a esos pocos datos, lo cual además de ganar en velocidad evitaría cachear en memoria las páginas no utilizadas.

    lunes, 31 de octubre de 2016 22:05