PLANES DE MANTENIMIENTO SQL Server

PLANES DE MANTENIMIENTO SQL Server

Hola a todos,
Soy un administrador y responable del mantenimiento de el ERP Ahora Soluciones, el cual esta basado en SQL Server. Sus diferentes versiónes han trabajado con SQL 2000, 2005, y ahora 2008 y/o 2008 R2.
La questión que quiero plantear ahora es la siguiente... mantengo varios clientes con este ERP y cada uno tiene sus peculiaridades a la hora de atacar a la base de datos y trabajar.... unos son más intensivos en el trabajo diario mientras que otros requieren más de procesos bach o masivos, etc... dependiendo del sector al que esta enfocado la empresa y la forma de gestionarse.....

Desde hace ya tiempo estoy trabajando y estudiando la mejor forma de realizar un plan de mantenimento o tarea programada que realize los trabajos de actulización de estadisticas, copias de seguridad, regenerar indices y demás.... me gustaría compartir esto con vosotros para ver si estoy cometiendo algún error o si se puede hacer de otras formas más eficente...

En primer lugar quisiera hablar de las diferentes tareas o tipos de tarea que tenemos definidos en SQL Server y que uso o me ayudan a crear mis planes de mantenimiento....

Tarea Limpieza Mantenimiento
La tarea Limpieza de mantenimiento quita archivos relacionados con planes de mantenimiento, entre los que se incluyen archivos de copia de seguridad de la base de datos e informes creados a partir de planes de mantenimiento.

El uso de la tarea Limpieza de mantenimiento permite que un paquete pueda quitar los archivos de copia de seguridad o los informes del plan de mantenimiento del servidor especificado. La tarea Limpieza de mantenimiento incluye una opción para quitar un archivo específico o un grupo de archivos de una carpeta. También puede especificar la extensión de los archivos que desea eliminar.

Cuando se configura la tarea Limpieza de mantenimiento para quitar archivos de copia de seguridad, la extensión del nombre de archivo predeterminada es BAK. Para archivos de informe, la extensión predeterminada es TXT. Puede actualizar las extensiones para que se adapten a sus necesidades; la única limitación es que las extensiones deben tener una longitud inferior a 256 caracteres.

Normalmente, conviene quitar archivos los antiguos que ya no son necesarios; la tarea Limpieza de mantenimiento se puede configurar para eliminar archivos con una antigüedad específica. Por ejemplo, se puede configurar la tarea para eliminar archivos que tienen más de cuatro semanas. También puede especificar la antigüedad de los archivos que desea eliminar en días, semanas, meses o años. Si no especifica la antigüedad mínima de los archivos que desea eliminar, se eliminan todos los archivos del tipo especificado.

Importante: En cualquier caso se debería de dejar siempre esta tarea configurada. Lo normal sería dejar al menos la última semana, aunque esto depende un poco de las limitaciones de espacio que tenga el servidor del cliente y el tamaño de la base de datos.

Tarea Actualizar Estadísticas
En primer lugar se explicará que son las estadísticas. SQL Server 2008 permite crear información estadística acerca de la distribución de valores en una columna. El optimizador de consultas utiliza esta información estadística para determinar el plan de consulta óptimo realizando una estimación del costo de usar un índice para evaluar la consulta.

Es decir, el planificador de consultas de SQL usará estas estadísticas para decidir cuál será la mejor forma de ejecutar una consulta.

Importante: Esta tarea solo tiene sentido ejecutarla si previamente hemos deshabilitado la opción de recalcular estadísticas automáticamente. Si la BBDD está configurada para que recalcule las estadísticas automáticamente no es necesario programar esta tarea. Suele ser recomendable deshabilitar esta opción en la BBDD y programar una tarea de este tipo, principalmente porque el cálculo automático de estadísticas consume bastantes recursos del servidor. Lo recomendable por tanto sería deshabilitar el cálculo automático y poner una tarea todas las noches que las recalcule.

Tarea Reducir Base de Datos
En SQL Server 2005, pueden reducirse todos los archivos de una base de datos para quitar las páginas que no se utilizan. Aunque Database Engine (Motor de base de datos) aprovechará el espacio de manera efectiva, existen ocasiones en las que un archivo no tiene por qué ser tan grande como lo era anteriormente. En estos casos, la reducción del archivo puede ser necesaria. Pueden reducirse los archivos de datos y los archivos de registro de transacciones. Los archivos de la base de datos se pueden reducir manualmente, en grupo o de uno en uno; también se puede configurar la base de datos para que se reduzca automáticamente a intervalos determinados.

Considere la siguiente información cuando desee reducir un archivo o base de datos:

•La reducción es más efectiva después de una operación que cree mucho espacio no utilizado, como por ejemplo, una operación para truncar o eliminar tablas.
•La mayoría de las bases de datos requieren que haya espacio disponible para realizar las operaciones diarias normales. Si se reduce una base de datos de forma reiterada y su tamaño vuelve a aumentar, esto indica que el espacio que se redujo es necesario para las operaciones habituales. En estos casos, no sirve reducir la base de datos reiteradamente.
•La reducción no mantiene el estado de fragmentación de los índices de la base de datos y generalmente aumenta la fragmentación hasta cierto punto. Por ejemplo, no se debe reducir una base de datos o archivo de datos después de volver a generar los índices. Esta es otra razón para no reducir la base de datos reiteradamente.

Por tanto este tipo de tareas no se debería ejecutar diariamente, se aconseja realizar esta tarea quincenal o mensualmente y siempre antes del plan de mantenimiento que incluya un volver a generar índices o un regenerar índices.

Tarea Reorganizar Índices
Los índices como todos sabemos sirven para acelerar determinadas consultas SQL que se lancen contra una tabla. De forma que hacer una consulta sobre un campo que esta indexado será mucho más rápido y eficiente que hacerlo contra un campo que no lo esté. Pensad que si hay un índice, se puede llegar en muy pocos pasos a un dato, mientras que si no lo hay, el servidor ha de recorrer la tabla linealmente hasta encontrarlo.

SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) mantiene índices automáticamente cada vez que inserta, actualiza o elimina operaciones realizadas en los datos subyacentes. Con el tiempo, estas modificaciones pueden hacer que la información del índice se disperse por la base de datos (se fragmente). La fragmentación ocurre cuando los índices tienen páginas en las que la ordenación lógica, basada en el valor de clave, no coincide con la ordenación física dentro del archivo de datos. Los índices muy fragmentados pueden reducir el rendimiento de la consulta y ralentizar la respuesta de la aplicación.

Por tanto la tarea de reorganizar índices básicamente lo que hace es revisar los índices ya creados en la BBDD y de fragmentarlos/reorganizarlos si es necesario para que sean más eficientes. Este tipo de tareas en principio se podría realizar cada noche al igual que la de actualizar estadísticas.

Tarea Volver a Generar Índices
La tarea Volver a generar índice vuelve a generar los índices de las tablas y vistas de bases de datos de SQL Server. Es decir hace lo mismo que la tarea de recalcular, pero lo que hace es eliminarlo y volverlo a crear desde cero.

Si todas las noches ejecutamos la tarea del recalculo esta tarea de volver a regenerar no hace falta hacerla diariamente y se podría ejecutar quincenalmente/semanalmente/mensualmente. Si decidimos ejecutar esta tarea de regenerar todas las noches, no sería necesario recalcular los índices. Por tanto otra opción sería pasar esta tarea cada noche.

Por tanto planteo mi primera pregunta, que es mas correcto e importante... regenerar los indices y luego las estadisticas o las estadisticas y luego los indices..... digo esto... porque bajo vuestra experiencia, sería más interesante dejar las estadisticas que el servidor las gestione automaticamente y olvidamos esta parte en el plan de manteniento...

Perdon por el toston....


Comentarios

Hola Shaobert como estas !, bueno de acuerdo a tu pregunta y el escenario planteado, tenes que encarar que las tareas de indices tengan como objetivo poder diferenciar si es necesario hacer una reorganizacion o bien un regeneracion de indices, pues ello afectra tanto a la performnace como el espacio necesario para poder realizar las tareas de reorganizacion y regeneración de indices. Luego tendrías que tener otra tarea que te haga la actualización de estadisticas. Tambien te recomiendo que tengas encendida la opción de base de datos 'Auto Create Statistics'. Con respecto al momento de correrlo deberías tratar de ver cuales son los horarios de menor actividad sobre las bases y trata (si aplica) de que sea luego de operaciones batch que hayan realizado grandes modificaciones de datos.

Un abrazo virtual.

JuanPLG


Hola Juan,

En primer lugar gracias por tu respuesta... a ver si voy aclarando cosas.. ya que incialmente era un ladrillo lo que deje en el post..XD.

Por norma general no distingo una opción de la otra... es decir, actualizo esdatistcias y reorganizo indices con frequencia (por norma general diariamente).
Luego dependiendo del caso (una vez al mes apróx.) regenero de nuevo todos los indices, justo despues de hacer una reducción de la base de datos.

Esto en la mayória de los casos es una tarea nocturna, ya que en la mayoría de los casos se lanza por la noche/madrugada y no suele haber probleas de espacio-tiempo.

Decir que en principio el esapcio no suele ser un problema... por tanto no suele procuparme... pero si el rendimiento del servidor en general... Por esa razón suelo desactivar la opcin de "actualizar estadisticas auto." ya que las recalculo cada noche en los proceso... En versiones antiguas como SQL2000 /2005 esta opción solía relentizar de una manera sensible el servidor... no he veririfcado si en entornos 2008 ó 2008 R2 es tan perceptible tener marcada esta opción.

Otra historia, es el tema de las estadisticas... ya investigue hace un tiempo que era mejor... si actualizar las estadisticas antes de generar/reorganizar los indices o despues... ya que alguien que "supuestamente" sabía mucho de esto me planteaba que debía de ser despues....tras leer varios foros y mucha documentación al respecto... nunca encontre un lugar donde se aclarase este punto... pero entiendo que se debe de hacer siempre antes... ya que las estadisticas son la información sobre la distribución de los datos en la tabla y por tanto algo fundamental para la elección y creación de un buen indice...
si estoy en un error agradecería que me sacaraís de el...

Por último... cuanto te refería a decidir entre regenerar o reorganizar un indice... estas hablando de estuadiar la dispersión del indice para decidir que camino tomar?? correcto?

Hola Shaobert, como estas ?.
Bueno, sí la reindexacion o reorganizacion de indices es previo a la actualizacion de las estadisticas, pues te puede cambiar la distribucion fisica de los datos y el path de acceso con lo cual impacta en la eleccion por parte del motor de un determinado plan de ejecución.
Con respecto a tu ultima pregunta, sí, es determinar que es lo mas óptimo de acuerdo a la fragmentación que sufra el indice, para ello podes investigar la dmv 'sys.dm_db_index_physical_stats', es muy útil.

Saludos,

JuanPLG


Hola JuanPLG,

GRacias por tu respuesta, lo cierto es que ando algo liado... supongo que como todos...

De momento sigo "estandarizando" mi caso medio de plan de manteniento. Este es lo que suelo hacer en cada caso y luego en los casos más criticos ya entro a otro nivel de detalle.... a ver que te parece esta planteamiento como plan de mantenimiento básico.

SQL SERVER 2005/2008/2008R2
Bases de datos entre 1 y 8 gigas... la estructura de las bases de datos es básicamante la misma...

Suelo hacerlos con los propios planes de mant de SQL y sus asistentes, no suelo usar comandos.

A.- Copias de seguridad diarias, algunas a medio día tambien. Dependiendo del espacio disponible en el servidor si mantien copias de una o dos semanas.
B.- Siempre tras la copia de seguridad nocturna. Se reorganizan los incidices y se recalculan las estadisticas.
C.- Mensualmente, se reduce la base de datos y se rehacen de nuevo los indices.

En algunos los SQL Express simplemente se crea un proceso de copias de seguridad. Suelen ser bases de datos pequeñas (1 giga o menos) y con poca actividad y usuarios (5 ó menos en la mayoría de los casos 2 o 3).

Que te parece....

Hola Shaobert como estas !, la verdad que en lineas generales esta bien pensado, al tomar en cuenta tres factores: necesidad del negocio - criticidad de los datos - recovery.

Solo una sugerencia si tienen licencias de SQL Server 2008 R2 Enterprise edition, trata de utilizar la característica de 'COMPRESSION' para los backup de las bases de datos, te ahorra bastante espacio.
También trata de hacerte alguna prueba con los datos resguardados para verificar que la metodología que estas implementando puede aplicarse ante algún problema.

Saludos virtuales.

JuanPLG