Incidencias

¿Cómo no hacer un DWH? (Parte 2 de 2)

Continuamos donde lo dejamos el otro día en nuestro artículo de ¿cómo no hacer un DWH? y seguimos repasando los errores más comunes a la hora de diseñar un DWH. Si no habéis leído la primera parte os recomiendo hacerlo ahora, antes de este artículo ya que este es la continuación directa de ese primer post. 

Errores del 12 al 7

Antes de empezar con los 6 errores más graves que cometemos a la hora de diseñar un DWH vamos a repasar brevemente los errores que vimos en la primera parte de este artículo.

  • Error 12: Incluir campos de texto en tablas de hechos para filtrar u ordenar
  • Error 11: Escatimar en la información de nuestras dimensiones para ahorrar espacio
  • Error 10: Dividir las jerarquías y en varias dimensiones
  • Error 9: No enfrentar las dimensiones lentamente cambiantes
  • Error 8: No crear foreign keys específicas
  • Error 7: Añadir dimensiones a la tabla de hechos
Banner-Telegram

Errores más graves al crear un DWH

Ahora si, ya conocemos los 6 primeros errores más comunes a la hora de crear nuestro DWH vamos a repasar los 6 que nos quedan, los más graves.

Error 6: Crear el modelo dimensional del DWH a la medida de un informe particular

No hay mucho más que decir, el título lo dice todo. Construir el modelo de datos a medida para los informes que se van a realizar es un grave error que a la larga dificultará mucho el escalado de nuestro DWH y la integración de nuevos reportes. Es común definir primero los objetivos de nuestro DWH y los reportes que los usuarios de negocio van a necesitar previamente antes de la propia arquitectura del modelo, estas definiciones son necesarias pero no pueden ser la base del DWH de fondo. Como arquitectos de datos debemos pensar en todo y dejar el modelo preparado para futuros requisitos. 

Este error es común sobre todo cuando se delega la creación en equipos externos y se definen como objetivos la entrega de unos informes predefinidos. Mucho cuidado con los términos de tu contrato de externalización.

Error 5: Compartir una tabla de hechos para hechos de distinta granularidad

Como sabes, las tablas de hechos pueden acumular miles de millones de registros a lo largo del tiempo y eso hace que operaciones pesadas como agregaciones para, por ejemplo, calcular el total de ventas por meses puedan llevar mucho tiempo y recursos. Una buena solución para eso es persistir ese dato ya agrupado en otra tabla para disponer de él de una manera mucho más rápida. Sin embargo, aunque estemos hablando de los mismos hechos (las ventas en este caso), el detalle y los agregados no tienen la misma granularidad por lo que no deben compartir la misma tabla o a la larga podremos caer en errores de incoherencia de datos.

Error 4: No añadir todo el detalle a la última capa del DWH

Tradicionalmente, los DWH se han dividido en capas, tenemos una primera capa de staging donde cargamos en bruto la información de los sistemas operacionales, una segunda capa relacional (normalmente en un modelo copo de nieve) donde ya la información ha sido integrada y se han añadido las relaciones y una última capa dimensional que será nuestro modelo de estrella con las tablas de agregados adaptadas a nuestros KPIs que consumirán las herramientas de reportes. En la actualidad, esta nomenclatura se está reemplazando por bronce, plata y oro pero sigue respondiendo a los mismos términos.

Podemos pensar que es una buena idea no llevar información que no se va a consumir al modelo de estrella para aligerar el modelo y que las consultas puedan ir más rápido pero, sin embargo, lo que vamos a terminar consiguiendo es que cuando el usuario final necesite esa información tenga que atacar al modelo relacional o en su defecto un extra de trabajo para los equipos de desarrollo BI. En este sentido es mejor opción detallar al máximo la capa dimensional y que sea el usuario desde la herramienta de reporte quien decida qué información mostrar.

Error 3: No usar tablas de agregados

Cuando nos enfrentamos a un problema de rendimiento de nuestro DWH (lo haremos, todos rinden mal) podemos caer en la tentación de añadir más recursos de CPU y RAM cuando lo que normalmente solucionará el problema es crear tablas de agregados para evitar ese recálculo continuo a la hora de mostrar los informes. Las tablas de agregados son un objeto más a mantener y puede parecer que el esfuerzo no merece la pena pero realmente es lo que va a descargar de trabajo a nuestro servidor. Además, para evitar esto, podemos hacer uso de vistas materializadas o vistas indexadas siempre que nuestro gestor de base de datos lo permita.

Error 2: No unificar los hechos entre distintas tablas de hechos de nuestro DWH

En el artículo de ayer, cuando definimos un DWH dijimos que era un sistema donde la información de diferentes orígenes se encuentra integrada. Esto es un verdadero reto a la hora de modelar un DWH y en ocasiones, por necesidades de negocio optamos por separar la información de diferentes orígenes en tablas diferentes para una explotación individual. Esto no tiene nada de malo pero tenemos que tener cuidado y no caer en el error de no unificar los criterios. Aunque la información se encuentre en distintas tablas de hechos debe responder a las mismas dimensiones y tener los mismos criterios para permitir agregaciones entre sí.

Y el mayor error….

Error 1: No ajustar las dimensiones entre tablas de hechos

Cuando modelamos un DWH es común encontrarnos con información duplicada entre diferentes orígenes. Esto se puede ver con mayor frecuencia en los maestros de personas. En ocasiones una misma persona puede ser cliente y proveedor o cliente y empleado. O cliente en dos aplicaciones distintas como la tienda web y la tienda física. Muchas veces, por falta de tiempo, recursos o una mezcla de ambas se cargan los maestros tal cual sin identificar estas dimensiones duplicadas. Esto nos va a llevar a errores a la hora de aplicar agregaciones y filtrados por lo que debemos prestar especial atención a estos casos y dedicar el tiempo y los recursos que sean necesarios para solventarlos. De lo contrario nuestro DWH no cumplirá su función principal de tener la información integrada y unificada.

Conclusión

En esta serie de dos artículos hemos podido ver los errores más comunes a la hora de plantearse la arquitectura de un nuevo DWH. Espero que gracias a estos post no caigáis en estos errores o seáis capaces de subsanarlos a tiempo en caso contrario. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

PD: El artículo original de Kimball fue borrado ya pero por suerte nada escapa del archivo de internet. Podéis encontrarlo aquí.

Publicado por Roberto Carrancio en Rendimiento, 0 comentarios

Recrear logins para Always On

Cuando movemos bases de datos entre entornos o, a la hora de tener un Always On moviendo bases de datos entre distintos servidores SQL Server, es común encontrarse con un problema de usuarios huérfanos ya que los sid de los logins pueden diferir entre los distintos servidores. Para evitar este problema vamos a usar el procedimiento almacenado sp_help_revlogin y así crear los logins con el mismo sid y contraseña.

Ahora ya sabes como recrear tus logins para no tener problemas de usuarios huerfanos en un grupo de alta disponibilidad Always On o cuando mueves bases de datos entre servidores. Recuerda también que tenemos un artículo explicando «como prevenir usuarios huérfanos» en el que explicamos otros métodos para evitar este problema.

Banner-Telegram

Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Alta Disponibilidad, Cloud, SQL Server, Videos, 0 comentarios

¿Cómo no hacer un DWH? (Parte 1 de 2)

Hoy vamos a viajar al pasado para recuperar un artículo de Ralph Kimball escrito en 2001 pero que aún, 23 años después, sigue estando muy presente. El artículo recoge los 12 errores más comunes (y más perjudiciales) que se cometen a la hora de diseñar un DataWareHouse (DWH). Si ya tienes experiencia en este tipo de entornos vas a notar que son errores que a menudo podemos cometer pero que necesariamente tenemos que corregir al poco tiempo. En estos entornos no valen las cosas a medias, para un buen rendimiento es necesario hacer las cosas bien desde el principio o la bola crecerá tanto que será ingestionable.

¿Qué es un DWH?

Empecemos por el principio, un almacén de datos, datawarehouse o DWH es un sistema diseñado para almacenar y, posteriormente, analizar datos. No es un sistema cualquiera y tiene sus particularidades ya que en él, vamos a integrar todos los datos de los distintos orígenes de nuestra organización, incluso de orígenes externos. Por ejemplo, en nuestro DWH tendremos los datos de nuestra aplicación de ventas, contabilidad, tienda web y, en ocasiones, incluso la base de datos de artículos de nuestros proveedores.

Banner-Telegram

Los DWH se caracterizan por contener grandes cantidades de información histórica permitiendo a los analistas de datos realizar análisis temporales y crear predicciones de tendencias a futuro. Como podrás imaginar, para que todo esto funcione, tiene que estar todo muy organizado, estructurado y optimizado para el acceso y análisis rápido de la información. Gracias a procesos ETL (extracción, transformación y carga por sus siglas en inglés) vamos a cargar las tablas de dimensiones y de hechos del modelo de estrella de nuestro DWH,

Errores comunes cuando creamos un DWH

Ahora si, después de esta pequeña introducción vamos al lío, estos son los doce errores más comunes definidos por Kimball.

Error 12: Incluir campos de texto en tablas de hechos para filtrar u ordenar

En un modelo dimensional, las tablas de hecho y de dimensiones se diferencian por contener indicadores numéricos y atributos respectivamente. A veces, la clasificación de un dato puede ser ambigua, como la hora de una venta o el nombre del transportista que nos entrega un pedido. En caso de duda, os recomiendo evitar textos largos en las tablas de hecho para optimizar el espacio y el rendimiento, y considerar como dimensión cualquier dato compartido entre varias tablas de hecho. Al fin y al cabo el almacenamiento es barato en precio pero costoso a la hora de leerlo, las tablas de hechos pueden llegar a tener millones de registros y debemos evitar poner en ellas cualquier texto que pueda ser común a varias tablas o registros. Eso será siempre una dimensión.

Error 11: Escatimar en la información de nuestras dimensiones para ahorrar espacio.

La información es poder y aunque en este momento podamos pensar que no necesitamos ciertos datos y que podemos prescindir de ellos siempre es importante guardarlos por si en un futuro los necesitamos. Esa es la idea detrás de las primeras capas bronce de los data lakes pero, llevado al caso que nos ocupa, en nuestro DWH es una buena idea almacenar esa información si se refiere a dimensiones. El tamaño de las tablas de dimensiones con cientos o pocos miles de registros será despreciable al lado de las grandes tablas de hechos con millones de registros por lo que no debemos preocuparnos por ese aspecto. Otra cosa será que saquemos los datos en la capa de presentación si no se nos solicita pero tenerlo siempre será una buena idea.

Error 10: Dividir las jerarquías y en varias dimensiones

Las dimensiones se agrupan en jerarquías que tienen una relación de uno a muchos. En un país existen muchas provincias y en cada una de esas provincias muchas poblaciones. Cada población a su vez tiene muchos clientes. Podemos pensar en que es una buena idea tener las tablas normalizadas como nos enseñaron en la universidad y crear una tabla por cada una de esas dimensiones.

Eso es lo idea para un modelo transaccional pero cuando hablamos de un DWH donde las lecturas priman sobre las escrituras y el almacenamiento, en la última capa de nuestro DWH el modelo debe ser puramente de estrella y no de copo de nieve por lo que en una sola tabla para esa jerarquía. Es importante aquí destacar de esta última frase la referencia a esa última capa que consumen los reportes ya que nuestro DWH tendrá otras capas inferiores donde sí tendremos normalizados los datos.

Error 9: No enfrentar las dimensiones lentamente cambiantes

Ya explicamos en nuestro artículo sobre el modelo de estrella lo que es una dimensión de variación lenta o lentamente cambiante. Es importante que anticipemos estos cambios desde el inicio del diseño de nuestro modelo o en un futuro tendremos problemas. Por ejemplo, no os imagináis el caos que se me montó una vez a mi cuando un NIE de un cliente extranjero cambió a DNI al obtener la nacionalidad y yo no había pensado que ese dato era cambiante. 

Error 8: No crear foreign keys específicas en tu DWH

En ocasiones podemos pensar que un valor intrínseco de nuestras dimensiones puede actuar como clave y cometemos el error de no crear una clave dedicada para esos registros. Sin embargo, a la larga eso puede llegar a ser un problema y para evitarlo es aconsejable crear nuestros propios identificadores numéricos para los registros de nuestras dimensiones y enlazar con ellos las tablas de hechos. Pensad en el ejemplo del error anterior, el NIE o DNI puede parecer un identificador personal válido pero cuando no lo es puede ser un verdadero quebradero de cabeza. 

Error 7: Añadir dimensiones a la tabla de hechos del DWH

Esto puede parecer básico, pero si ya os habéis enfrentado a varios modelos de DWH sabréis que es más común de lo que parece. En un modelo de estrella todas las dimensiones deben estar en sus tablas de dimensiones y las tablas de hechos solo deben tener relación con esas dimensiones o jerarquía. Caer en este error nos llevará a un mayor tamaño de nuestra tabla de hechos lo que repercutirá directamente en el consumo de E/S de nuestras consultas y empeorará el rendimiento.  

Conclusión

Hemos visto la mitad de los errores más comunes descritos por Kimball, como el artículo si no iba a quedar muy grande vamos a dejar los 6 siguientes errores (y los más graves) para una segunda parte. Espero que os esté gustando, que os sea de utilidad y por supuesto que a partir de ahora no caigáis en estos errores. Si al leer esto has pensado en algo que tienes mal en tu DWH solucionalo antes de que sea tarde, vas a ver que, a la larga, la ganancia es sustancial. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, 1 comentario

Perform volume maintenance tasks

Muchos me habéis preguntado por el permiso “Perform volume maintenance tasks” o “Realizar tareas de mantenimiento del equipo” por el que pregunta SQL Server al instalarse. Hay quien me ha dicho que siempre lo marca, otros que nunca pero en general existe cierto desconocimiento sobre sus pros y sus contras y lo que es más importante sobre lo que hace o no este permiso de Windows. En el artículo de hoy vamos a tratar de responder estas dudas.

Inicialización de archivos de base de datos

Seguramente te suene este concepto, la inicialización de archivos de base de datos es el proceso por el que SQL Server crea y dimensiona los archivos de bases de datos y logs ya sea de manera manual o con el crecimiento automático. Desde los inicios del SQL moderno que conocemos hoy en día (SQL 2005) esto implica crear o redimensionar los ficheros para reservar ese espacio para la base de datos. Durante este proceso SQL Server pone a 0 todos los sectores del disco duro a nivel físico para posteriormente ir rellenandolos con datos. Esto es un proceso lento y pesado que demora las operaciones de escritura, por eso las buenas prácticas siempre recomiendan tener todos los ficheros dimensionados previamente a la hora de trabajar para evitar el crecimiento automático.

Banner-Telegram

Ahora bien, existe una excepción que nos permitirá saltarnos este paso y dimensionar los ficheros de datos sin tener que modificar los sectores del disco para establecerlos a 0 y es lo que se conoce como inicialización instantánea de base de datos gracias al privilegio “perform volume maintenance task”. Esto también afecta a los archivos de base de datos de Analysis Service. Esta configuración también se aplica en los ficheros de log desde SQL Server 2022 y está disponible también en las bases de datos y en las instancias administradas de Azure. 

Perform volume maintenance tasks

Este permiso, asignado por directiva de windows por defecto a los usuarios administradores del equipo, permite realizar las tareas de mantenimiento típicas sobre los discos duros tales como desfragmentar, crear y modificar nuevos volúmenes o ejecutar el asistente de limpieza. Esto es lo que dice la teoría, pero como hemos visto, a nosotros como DBAs nos interesa porque es lo que nos va a permitir la inicialización instantánea de los archivos de bases de datos.

Consideraciones de seguridad

Como hemos visto, esta política por defecto otorga el permiso a los administradores del equipo, sin embargo, vosotros que sois buenos DBAs, sabréis que no es conveniente que la cuenta de servicio de SQL Server sea administradora local. O eso dicen las buenas prácticas de seguridad. 

Además, ten en cuenta que, gracias a este permiso es posible ver el valor de los sectores de disco y recuperar información eliminada, lo que también puede ser un problema de seguridad. En este sentido, tendremos que valorar junto con el equipo de ciberseguridad de nuestra empresa, la ganancia que vamos a sacar de este privilegio frente a los posibles riesgos de seguridad.

Por un lado, si tenemos bien dimensionados los archivos de datos para nuestro crecimiento y podemos hacer redimensionamiento manuales en ventanas de mantenimiento fuera de las horas de mayor carga de trabajo es probable que no sea necesario. Si esto no es así y tenemos muchos crecimientos automáticos sin, además, tener este privilegio concedido, podremos experimentar grandes caídas del rendimiento e incluso encontrarnos en el log de errores de SQL los errores 5144 y 5145 de timeout al redimensionar los ficheros. En estos casos será recomendable conceder el permiso siempre reduciendo al mínimo los riesgos de seguridad, por ejemplo, usando para SQL Server cuentas de servicio administradas gMSA.

Como asignar el permiso Perform volume maintenance tasks

Ahora que ya sabes lo que implica la asignación de este privilegio de Windows vamos a ver como concederlo. Como ya hemos visto, durante la instalación tenemos un check que nos lo asignará automáticamente pero, si no lo hemos hecho, o si hemos cambiado la cuenta de servicio de SQL Server, será necesario hacerlo manualmente. Hemos visto que se otorga a través de las directivas de windows por lo que, lo primero que necesitaremos será abrir la consola gpedit.msc. Una vez en el editor de directivas nos iremos a Configuración del equipo – Configuración de Windows – Configuración de seguridad – Directivas locales – Asignación de derechos de usuario. En este apartado encontraremos el permiso “Realizar tareas de mantenimiento del equipo” al que añadiremos nuestra cuenta de servicio de SQL Server. Una vez cambiado esto será necesario reiniciar el servicio de SQL Server para aplicar los cambios.

Perform-volume-maintenance-tasks

Pruebas de rendimiento

Para terminar quiero compartir con vosotros una prueba de rendimiento que he hecho en mi equipo. Para la prueba, sin haber asignado el permiso a la cuenta de SQL, he creado unas bases de datos de 10 Gb de tamaño inicial en 3 discos duros, un M2, un SSD y un HDD. Luego he realizado la misma prueba pero con el privilegio otorgado. Estos son los resultados: 

 M2SSDHDD
CON Inicialización instantánea86 ms127ms852 ms
SIN Inicialización instantánea88 ms174 ms1118 ms

Conclusión

Configurar el permiso para realizar tareas de mantenimiento sobre los volúmenes puede tener mejoras sustanciales en la creación o redimensionamiento de los ficheros de bases de datos. Sin embargo, tiene implicaciones de seguridad que es necesario conocer y valorar previamente. Además, aunque la mejora de rendimiento sea notable, sigue sin ser recomendable confiar en el crecimiento automático, siendo necesario dimensionar previamente los ficheros para evitar problemas. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, Rendimiento, SQL Server, 1 comentario

Usar PERFMON para detectar problemas de rendimiento de SQL

En este quinto video blog vamos a aprender a usar el monitor de rendimiento de Windows (PERFMON) para medir el rendimiento de SQL Server y poder detectar cuando hay algún problema. Es importante conocer previamente el estado normal de nuestros servidores para ser capaces de identificar cuando estamos ante un problema de rendimiento.

En el video hemos visto como usar en perfmon las métricas de uso de CPU combinadas con los lotes por segundo que procesa SQL Server así como la velocidad de lectura y escritura de los discos. Además de estas métricas también podemos revisar las compilaciones y recompilaciones de nuestro SQL Server cuyo valor ideal será un 10% o menos del total de lotes por segundo.

Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, Videos, 0 comentarios

Detectando fragmentación de índices en SQL Server y Azure

Volvemos a la carga con un artículo sobre índices de esos que tanto nos gustan. Esta vez vamos a hablar de un tema muy importante y es detectar qué índices están más fragmentados y cómo solucionarlo. A menudo vemos que una mala gestión de los planes de mantenimiento provocan una degradación del rendimiento de las consultas y eso, gran parte de las veces es debido a un problema de fragmentación de índices o falta de mantenimiento de las estadísticas. Hoy vamos a centrarnos en el primero de estos aspectos.

¿Cómo detectar fragmentación en los índices?

Para ver la fragmentación de un índice en concreto podemos hacerlo desde el entorno gráfico de nuestro SSMS, haciendo click derecho sobre el objeto y mirando sus propiedades. Sin embargo, esto no es práctico cuando tenemos cientos de índices en nuestra base de datos y queremos saber de un vistazo cuales son los más fragmentados y cuanto. Para ello, usaremos una consulta sobre la función de sistema sys.dm_db_index_physical_stats

Otra de las cosas que debemos tener en cuenta es el tamaño de nuestra tabla, con menos de 1000 páginas, el motor de base de datos directamente ignorará los índices nonclustered y, en el caso de los clustered, tampoco vamos a notar diferencia.

Con esto en mente vamos a preparar el script. 

Revisemos el script, por un lado podemos ver que a la función para ver las estadísticas de los índices le estamos pasando el id de la base de datos actual para que se ejecute en ese contexto. Esto es para evitar que se ejecute por todas las bases de datos y podamos tener un problema de rendimiento con esta consulta. Por otro lado vemos que solo afecta a tablas y vistas de usuario que tengan un índice clustered, el tipo de índice 0 está excluido de los filtros. Las tablas HEAP (sin índice clustered) necesitan otro tipo de tratamiento. Podemos ver también el filtro para solo mostrar índices con más de 1000 páginas y el de fragmentación superior al 5%, que suele considerarse el umbral de fragmentación aceptable.

Solucionar fragmentación de índices

Ahora que sabemos cuales son los índices más fragmentados debemos actuar y solucionar el problema. Sabemos que tenemos a nuestra disposición dos alternativas: reorganizar o reconstruir. Para elegir entre una opción u otra tenemos varios factores a tener en cuenta.

Por un lado tenemos el modo de operación de estas instrucciones, reorganizar siempre es una operación online lo que significa que solo generará sobre nuestro índice un intento de bloqueo compartido. El índice se podrá seguir leyendo durante la reordenación sin causar bloqueos. En cuanto a la reconstrucción, solo es online si se lo especificamos manualmente y eso solo es posible en ediciones Enterprise de SQL Server o en las bases de datos o instancias gestionadas de Azure. Si la reconstrucción es offline se generará un bloqueo exclusivo sobre el índice.

Por otro lado, la reconstrucción es más eficiente que la reorganización para porcentajes elevados de fragmentación y eso deberemos tenerlo también muy en cuenta.

¿Debería reorganizar o reconstruir mis índices con mucha fragmentación?

Esto no es una ciencia exacta y es un tema sobre el que hay muchas opiniones discordantes. Normalmente se habla de reorganizar los índices con una fragmentación superior al 5 o 10% y menor al 15 o 30%. Como veis es una horquilla muy amplia y para atinar tenemos que pensar en las las implicaciones de estas operaciones que ya hemos visto antes. Yo os voy a contar cómo lo hago yo pero esto es totalmente personal y deberás adaptarlo a cada caso.

Escenario 1: Mantenimiento programado

En este primer escenario estamos hablando de un mantenimiento programado dentro de una ventana de mantenimiento en la que no hay interferencia con otros procesos. Este caso es el más sencillo porque no tenemos que pensar en no entorpecer a nadie. En estos casos yo pongo el umbral para empezar a actuar en un 5%. Si estamos hablando de una edición Standard de SQL Server reorganizaré los índices con una fragmentación entre un 5 y un 20% y reconstruiré los de mayor fragmentación. Para ediciones Enterprise o Azure reduciré esa horquilla para reorganizar entre un 5 y un 15% y haré reorganizaciones online a partir del 15%.

Escenario 2: Problema puntual de rendimiento

En este escenario estamos hablando de un momento de carga de trabajo elevada en el que hemos recibido o detectado una incidencia por problemas de rendimiento. Tenemos que actuar rápido para solventar la situación pero entorpeciendo lo menos posible a los procesos de negocio que ya de partida tienen un rendimiento mermado. En estos casos pongo el umbral para empezar a actuar en fragmentaciones por encima del 10% en vez del 5. A partir de ahí, si tenemos la suerte de contar con una edición Enterprise, o estamos en Azure, no hay más problema, reconstruiremos con las mismas condiciones que en el escenario anterior, a partir del 15%. Para una edición Standard, donde si vamos a generar bloqueos si reconstruimos, intentaremos reorganizar hasta el 30% de fragmentación.

Solucionar estadísticas desactualizadas

Las estadísticas son clave para SQL Server. Como ya hemos comentado en este blog muchas veces, unas estadísticas desfasadas pueden tener el mismo impacto negativo o peor que un índice fragmentado. Por este motivo, es importante tenerlas en cuenta a la hora de realizar nuestros mantenimientos o enfrentar una incidencia por degradación de rendimiento. Una reconstrucción de índices siempre actualizará las estadísticas asociadas a ese índice pero en el caso de las reorganizaciones deberemos hacerlo manualmente. Tenemos que contar también con que una actualización de estadísticas es más ligera y rápida que un mantenimiento de índices por lo que, en caso de una degradación de rendimiento de una consulta puntual, yo siempre actualizo las estadísticas de las tablas involucradas como primera medida.

Conclusión

Ante un problema de rendimiento, tenemos que verificar el estado de nuestros índices y estadísticas. Además, consultar su nivel de fragmentación será clave a la hora de decidir si vamos a reorganizarlo o reconstruirlo y, todo esto, siempre sin dejar de lado las estadísticas. Tened en cuenta que por mucho que tengamos implementada una solución de mantenimiento de índices y estadísticas nunca vamos a estar 100% seguros de que no va a haber una variación tal de datos que nos va a generar fragmentación o a dejar desfasadas nuestras estadísticas. Es importante que mantengamos una monitorización y vigilancia continua para garantizar el mejor desempeño de nuestros SQL Server.

Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, Índices, Rendimiento, SQL Server, 1 comentario

Configurar planes de mantenimiento en SQL Server y Azure

Hola a todos y bienvenidos a este nuevo formato de Video Blog que espero que os guste y que podamos ver por aquí más a menudo. Hoy vamos a ver un caso práctico sobre como configurar planes de mantenimiento en nuestro SQL Server o instancia administrada en Azure gracias a los script de Ola Hallengren. En todo este tiempo como DBA (más de 10 años) os aseguro que más del 90% de las incidencias por supuestos problemas de rendimiento a las que me he enfrentado eran siempre por lo mismo, una falta de mantenimiento correcto. Por esto es importante programar tareas de reconstrucción de índices y mantenimiento de estadísticas. Y ya de paso, aprovechamos y configuramos las copias de seguridad y comprobaciones de integridad que también nos ofrece esta solución gratuita. Pocas veces vas a encontrar más por menos.

Guía de capítulos

  • 00:00 Introducción
  • 00:39 Descarga
  • 01:20 Instalación
  • 05:42 Backups
  • 10:15 Integrity Check
  • 11:42 Index Optimize
  • 13:13 Limpieza
  • 13:54 Log de procesos

Configurar planes de mantenimiento

Como podemos ver en el vídeo para descargar los scripts de mantenimiento solo deberemos acudir a la web de Ola Hallengren y descargar el script que se llama «MaintenanceSolution.sql». Con el script ya abierto en nuestro SSMS podremos configurar la base de datos donde se van a crear los scripts y una serie de configuraciones importantes para los jobs.

Una vez instalada la solución de planes de mantenimiento vamos a poder configurar en los distintos jobs las tareas de copias de seguridad, supervisión de la integridad y reconstrucción y actualización de índices y estadísticas para las bases de datos de sistema y de usuario. También es importante que configuremos los trabajos que incluyen las tareas de mantenimiento para no encontrarnos con incidencias de espacio en disco en un futuro.

Esta solución, además, tiene la ventaja de dejar un log bastante completo en una tabla llamada CommandLog que estará en la misma base de datos que hayamos creado los procedimientos almacenados de mantenimiento. En esta tabla podremos encontrar todo el historia de ejecuciones de todos los comandos con su detalle, horas de inicio y de fin y, por supuesto, si ha dado un error veremos el por qué.

Publicado por Roberto Carrancio en Cloud, SQL Server, Videos, 0 comentarios