Cloud

Bloqueos con un SPID negativo

Los bloqueos en SQL Server son un componente fundamental en la gestión de transacciones concurrentes, asegurando la integridad y consistencia de los datos. Sin embargo, algunos bloqueos pueden presentar características inusuales, como aquellos que involucran identificadores de sesión (SPID) negativos. Estos bloqueos negativos pueden generar confusión si no se comprenden a fondo, ya que están relacionados con operaciones internas de SQL Server o problemas específicos en el manejo de transacciones y recursos.

En este artículo, vamos a ver en profundidad los bloqueos con identificadores de sesión (SPID) negativos en SQL Server, incluyendo los valores del -1 al -5, explicando qué significan, qué los causa y cómo diagnosticarlos y resolverlos. Como vais a poder ver a lo largo del artículo, estos bloqueos no serán los más comunes que nos vamos a encontrar pero si que tienen una gran importancia y debemos conocerlos.

Introducción a los bloqueos en SQL Server

El sistema de gestión de bloqueos de SQL Server asegura que las transacciones accedan a los recursos de manera controlada, evitando conflictos que puedan comprometer la integridad de los datos. Los bloqueos suelen ser representados por un número positivo, que identifica la sesión (SPID) que sostiene el bloqueo. Sin embargo, en situaciones especiales, SQL Server puede mostrar bloqueos con identificadores de sesión negativos.

Estos SPID negativos no representan directamente sesiones de usuario, sino que están relacionados con tareas internas del motor de SQL Server, como la gestión de transacciones distribuidas (DTC), recuperación diferida, y la gestión de latches (mecanismos de sincronización de memoria). A continuación, vamos a explorar cada uno de estos identificadores negativos y sus implicaciones.

SPID -1: Bloqueo por Orphaned Lock (bloqueo huérfano)

El identificador -1 se asocia con bloqueos huérfanos (orphaned locks). Un bloqueo huérfano es un bloqueo que SQL Server ha perdido de vista, es decir, SQL Server ha perdido la referencia a qué sesión tenía el control de dicho bloqueo.

Descripción: El SPID -1 indica que el bloqueo ha sido dejado huérfano, lo que generalmente ocurre debido a errores en la gestión de bloqueos. En muchas ocasiones, este comportamiento es el resultado de un bug en SQL Server o de una desconexión inesperada de una sesión que estaba reteniendo el bloqueo.

Causas comunes: Esto puede suceder si una conexión de cliente se cierra inesperadamente mientras sostenía un bloqueo o si SQL Server experimenta un problema interno que afecta la gestión de los bloqueos. Estos bloqueos huérfanos pueden impedir que otros procesos accedan a los recursos bloqueados.

Diagnóstico y solución: En la mayoría de los casos, SQL Server debería liberar automáticamente los bloqueos huérfanos, pero si persisten, es recomendable revisar los registros de errores (SQL Server error logs) para identificar posibles fallos. Si el bloqueo huérfano afecta el rendimiento del servidor o causa problemas de acceso a los datos, es posible que se necesite reiniciar la instancia de SQL Server o aplicar parches que solucionen el problema.

SPID -2: Bloqueo por Pending DTC Transaction (transacción DTC pendiente)

El SPID -2 está relacionado con las transacciones distribuidas (DTC, Distributed Transaction Coordinator) que están pendientes de finalización. Esto ocurre cuando la conexión del cliente, que formaba parte de una transacción distribuida, se desconecta y la transacción queda en un estado incompleto, esperando que el administrador de DTC (MSDTC) procese el estado final de la transacción.

Descripción: Este identificador de sesión indica que SQL Server está esperando una notificación de cambio de estado por parte del coordinador de transacciones distribuidas (MSDTC). La transacción no puede completarse porque los clientes asociados con la transacción distribuida se han desconectado antes de invocar el commit o rollback.

Causas comunes: Esto suele ocurrir cuando una aplicación cliente que maneja transacciones DTC se desconecta inesperadamente sin finalizar correctamente la transacción. SQL Server queda a la espera de que el cliente confirme si debe comprometer o revertir la transacción.

Diagnóstico y solución: Para resolver el problema, el cliente debe reconectarse y completar la transacción invocando explícitamente un commit o rollback. En situaciones donde el cliente no puede reconectarse, el administrador de SQL Server puede finalizar la transacción manualmente utilizando las herramientas del coordinador de transacciones distribuidas (DTC). También es útil revisar los registros de errores de SQL Server y del DTC para identificar qué causó la desconexión.

SPID -3: Bloqueo por Deferred Recovery (recuperación diferida)

El SPID -3 está relacionado con transacciones diferidas. Una transacción diferida es una transacción que ha sido marcada para ser revertida o recuperada, pero que no puede completarse de inmediato debido a que los recursos necesarios no están disponibles.

Descripción: Este identificador indica que SQL Server mantiene el bloqueo porque una operación de recuperación o reversión ha sido pospuesta. Esto suele ocurrir cuando una transacción está en proceso de ser revertida (rollback), pero la operación no puede completarse debido a problemas con los recursos implicados, como archivos o tablas que ya no están disponibles.

Causas comunes: Las transacciones diferidas suelen ocurrir cuando SQL Server no puede acceder a los recursos necesarios para completar la reversión de la transacción. Un ejemplo sería si una tabla o índice fue eliminado mientras una transacción estaba activa sobre esos objetos. También puede ser resultado de problemas de espacio en disco o de memoria.

Diagnóstico y solución: Para diagnosticar este tipo de bloqueo, puedes utilizar la vista sys.dm_tran_active_transactions, que muestra información sobre las transacciones activas, incluidas las diferidas. Generalmente, SQL Server resolverá estas transacciones diferidas cuando los recursos se vuelvan disponibles, pero en algunos casos podría ser necesario realizar acciones manuales, como restaurar la base de datos o liberar espacio en disco.

SPID -4: Bloqueo por Latch Transition (transición de latch)

El SPID -4 se refiere a las transiciones de latch. Un latch es una estructura interna de sincronización que SQL Server utiliza para gestionar el acceso a los recursos en memoria, como las páginas de datos en la caché de búferes.

Descripción: Este SPID indica que SQL Server está en el proceso de liberar un latch, pero dicha liberación aún no ha finalizado. Estos bloqueos suelen aparecer cuando SQL Server está manejando una alta carga de trabajo que involucra operaciones intensivas de lectura o escritura en memoria.

Causas comunes: Las transiciones de latch son comunes en operaciones de alta concurrencia, como cuando múltiples sesiones intentan acceder a las mismas páginas en la caché de búferes. Esto puede ocurrir durante operaciones de entrada/salida intensivas o en escenarios donde se produce una contención por el acceso a recursos de memoria.

Diagnóstico y solución: Para diagnosticar estos bloqueos, puedes utilizar la vista sys.dm_os_latch_stats para monitorizar las estadísticas de latches. Si los bloqueos relacionados con latches son frecuentes, puede ser necesario optimizar las consultas, rediseñar los índices o ajustar los parámetros de configuración de memoria de SQL Server. También puedes revisar el tamaño de la caché de búferes para asegurarte de que SQL Server tenga suficientes recursos de memoria para manejar la carga de trabajo.

SPID -5: Bloqueo por Latch Task Releasor (liberación de latch)

El SPID -5 está relacionado con la liberación de latches en SQL Server, específicamente con tareas del sistema que están en proceso de liberar un latch. Los latches de entrada/salida (I/O) son los más comunes que se liberan bajo este identificador.

Descripción: Este identificador de sesión indica que SQL Server está esperando que una tarea del sistema libere un latch. Los I/O latches son los más comunes en este tipo de situación, protegiendo el acceso a las páginas de datos durante operaciones de lectura o escritura.

Causas comunes: Los bloqueos con SPID -5 suelen aparecer cuando hay contención en la memoria, particularmente en las páginas de datos almacenadas en la caché de búferes. Si varios hilos intentan acceder a la misma página simultáneamente, SQL Server utiliza un latch para asegurar que sólo un hilo acceda a la página en un momento dado, lo que puede generar tiempos de espera.

Diagnóstico y solución: Para diagnosticar este tipo de bloqueo, puedes utilizar las vistas sys.dm_exec_requests y sys.dm_os_waiting_tasks para identificar las sesiones que están esperando la liberación de latches. Optimizar el diseño de índices o ajustar los patrones de acceso a los datos puede ayudar a reducir la contención por los latches. Además, monitorizar el uso de la memoria y evaluar si SQL Server tiene suficientes recursos para manejar la carga de trabajo puede ser necesario.

Conclusión

Los bloqueos con identificadores de sesión negativos en SQL Server son indicadores de operaciones internas y procesos de administración de recursos dentro del motor de la base de datos. Desde bloqueos huérfanos hasta problemas con transacciones distribuidas y latches, cada uno de estos SPIDs negativos tiene un significado específico y un impacto potencial en el rendimiento y la estabilidad del servidor.

Comprender la naturaleza de estos bloqueos y cómo diagnosticarlos es clave para asegurar el buen funcionamiento de SQL Server. Utilizar herramientas como las vistas de administración dinámica (DMVs) y monitorizar los registros de errores te permitirá identificar problemas antes de que afecten el rendimiento general del sistema. En muchos casos, las soluciones implican ajustes en la configuración de recursos, la optimización de consultas y, en situaciones más complejas, la intervención manual para liberar o resolver los bloqueos pendientes.

SQL Server proporciona un entorno robusto para la gestión de transacciones y acceso concurrente, pero la correcta interpretación de estos SPIDs negativos puede marcar la diferencia en la identificación temprana de problemas que podrían afectar el rendimiento de la base de datos.

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, SQL Server, 0 comentarios

Impacto en el rendimiento de Query Store

Cuando hablamos de Query Store en SQL Server, lo hacemos refiriéndonos a una de las herramientas más útiles para controlar y mejorar el rendimiento de nuestras consultas. No es ningún secreto que es una herramienta que personalmente me encanta y, no es para menos, nos permite capturar el historial de ejecución, los planes utilizados y, lo más importante, las métricas asociadas. Sin embargo, el otro día, un seguidor me trasladó una inquietud en un comentario de YouTube y no es otra que si la activación de Query Store puede tener un impacto negativo en el rendimiento. Ciertamente, Query Store conlleva una carga adicional que, en ciertos entornos, debemos saber gestionar con cuidado.

En este artículo, vamos a profundizar en el impacto real que tiene el Query Store en términos de CPU, memoria y disco, y cómo podemos configurarlo para obtener el máximo beneficio sin comprometer el rendimiento de nuestros sistemas.

¿Qué hace Query Store y por qué es tan útil?

En resumidas cuentas, Query Store se encarga de registrar el historial de todas las consultas que se ejecutan en nuestra base de datos, junto con los planes de ejecución y sus métricas de rendimiento. Es como tener un «registro médico» de nuestras consultas, donde podemos ver qué ha ido mal (o bien) y cuándo. Esto nos permite identificar rápidamente problemas de rendimiento y aplicar soluciones, como forzar el uso de un plan de ejecución específico. Es decir, cuando una consulta empieza a tardar más de lo habitual, Query Store nos permite ver qué ha cambiado, ya sea el plan de ejecución o las estadísticas. 

Antes de seguir, si quieres saber más sobre el funcionamiento de Query Store, te recomiendo leer el artículo que le dedicamos.

¿Cuánto impacto tiene realmente Query Store en el rendimiento?

Aunque tener todo ese control suena genial, también hay que ser conscientes de que capturar tanta información tiene un coste. Y eso es justo lo que venimos a analizar hoy. Veamos cómo afecta a los distintos recursos del sistema.

Consumo de CPU y memoria

Lo primero que debemos tener claro es que Query Store no afecta a la ejecución directa de las consultas, ya que guarda la información de manera asíncrona. Pero eso no significa que no utilice recursos. El impacto más notable en CPU y memoria ocurre cuando se agregan los datos de las consultas para almacenarlos. Dependiendo de la cantidad de consultas y el tipo de carga (ad-hoc o batch, por ejemplo), este proceso puede requerir más recursos.

Por lo general, el impacto en CPU suele ser pequeño, pero no inexistente. El procesamiento de los datos para agregarlos y almacenarlos puede generar una pequeña sobrecarga, especialmente si el servidor ya está bajo presión por una alta carga de trabajo.

Hablando sobre la memoria RAM, Query Store usa su propia caché en memoria para almacenar temporalmente los datos antes de volcar (flush) al disco. En entornos con mucha actividad, puede necesitar más memoria de lo esperado si los intervalos de flush son largos o si el servidor está cerca de su límite de uso de memoria.

Espacio en disco

Aquí es donde más suele preocuparnos el impacto de Query Store. Todos los datos capturados tienen que almacenarse en disco, y si no tenemos cuidado, la cantidad de espacio utilizado puede crecer rápidamente. En Azure SQL Database, por ejemplo, el tamaño máximo que podemos asignar a Query Store es de 10 GB. En SQL Server on-premise, no hay un límite y, aunque el espacio propuesto por defecto es de 1 Gb podemos configurar manualmente el espacio que necesitemos y podamos asumir.

Si trabajamos en un entorno de producción con una base de datos que recibe muchas consultas por segundo, podríamos empezar a ver cómo el espacio en disco se reduce rápidamente si no gestionamos bien la configuración. En muchos casos, el crecimiento de los datos es gradual, pero en sistemas con grandes volúmenes de consultas, los datos pueden acumularse más rápido de lo esperado.

¿Cómo minimizar el impacto de Query Store?

Como hemos visto, es cierto que Query Store añade cierta carga al sistema, sin embargo, hay varias formas de mitigar su impacto y asegurarnos de que siga siendo beneficioso sin comprometer el rendimiento. Aquí os dejo algunas estrategias prácticas.

Ajustar el intervalo de flush

El flush es el proceso por el cual los datos que Query Store guarda en memoria en un primer momento se escriben en disco para persistirse. De manera predeterminada, este proceso ocurre cada 15 minutos, pero puedes ajustar este intervalo para reducir la carga en momentos críticos. Si trabajas con una base de datos muy activa, podrías reducir el intervalo para evitar que se acumule demasiada información en memoria y así dispersar la carga de escritura.

Una buena práctica es empezar con el valor por defecto y observar el comportamiento del servidor. Si notas que el servidor tiene picos de uso de disco en momentos específicos, reducir el intervalo de flush puede ayudar a que la escritura de datos sea más constante y menos impactante. Como ves, esta configuración afecta tanto a la cantidad de RAM que demanda Query Store como al consumo de CPU necesario para mover los datos de la memoria al disco.

Limitar el uso de espacio en disco

No todas las consultas tienen que ser almacenadas indefinidamente. SQL Server te permite configurar límites de espacio para Query Store y también establecer políticas de retención que eliminen los datos antiguos. Esto es especialmente útil para evitar que la información histórica crezca sin control.

Recomendación: Establece un límite de espacio en disco que sea acorde al tamaño y volumen de consultas de tu base de datos. Por ejemplo, para bases de datos medianas, un límite de 500 MB podría ser suficiente. En bases de datos más grandes, este valor puede aumentar, pero es esencial realizar una monitorización constante.

Configurar la retención de datos

Muy ligado al punto anterior. No tiene sentido almacenar datos de consultas por años si solo los vamos a analizar durante las últimas semanas. Configura un período de retención que se ajuste a tus necesidades de análisis. En la mayoría de los casos, mantener entre 30 y 60 días de historial es suficiente para identificar patrones y resolver problemas de rendimiento.

Usar el modo CUSTOM de captura

De forma predeterminada Query Store está configurado con un modo de captura automático que no captura todas las consultas sino solo aquellas que el motor de base de datos considera relevantes para el rendimiento. Esto, se puede cambiar para capturar todas las consultas lo que claramente incrementará el consumo de recursos.

Sin embargo, con SQL Server 2019, se introdujo un modo CUSTOM que nos permite capturar solo aquellas consultas que nos interesan, según criterios específicos que podemos definir. Esto es extremadamente útil en entornos donde se ejecutan miles de consultas ad-hoc o de bajo valor, que realmente no necesitamos monitorizar en detalle. Al usar este modo, reducimos el volumen de datos capturados, lo que disminuye la carga en disco y memoria.

Monitorizar el impacto de Query Store

Como siempre, es clave monitorizar cualquier herramienta que utilicemos en nuestros servidores. SQL Server Management Studio (SSMS) nos ofrece varias vistas que nos permiten ver el impacto que Query Store tiene en términos de uso de CPU, memoria y disco. Estas vistas nos ayudarán a realizar ajustes si detectamos que la carga es mayor de lo esperado. Otra opción sería usar el monitor de recursos de windows y comparar el consumo con la herramienta activada y sin ella

Conclusión

Habilitar Query Store puede ser un gran aliado para mejorar el rendimiento de nuestras bases de datos, pero requiere un enfoque cuidadoso para no generar sobrecarga en el servidor. Al ajustar el intervalo de flush, limitar el uso de espacio en disco, y capturar solo los datos necesarios, podemos beneficiarnos de su potencial sin afectar negativamente el rendimiento general.

La clave está en configurar y ajustar Query Store según las necesidades específicas de nuestro entorno. En la mayoría de los casos, unos pequeños ajustes pueden marcar una gran diferencia en términos de rendimiento y eficiencia. Como siempre, no olvides monitorizar y realizar pruebas periódicas para asegurarte de que todo funcione de manera óptima.

 

Publicado por Roberto Carrancio en Cloud, Rendimiento, SQL Server, 2 comentarios
¿Es la nube una solución competitiva?

¿Es la nube una solución competitiva?

Para hacer una solución SaaS (Software as a Service) e IaaS (Infrastructure as a Service) basada en Azure SQL y SQL Server realmente competitiva a nivel empresarial, debemos ser críticos y realistas. Aunque la nube ha sido abrazada por la mayoría de las empresas, siguen existiendo debates sobre los costes, el rendimiento y si realmente es la mejor opción en todos los casos. La cuestión de si las soluciones en la nube son superiores a las on-premise sigue siendo un tema caliente, y en este artículo vamos a tratar de abordar esta comparativa con argumentos sólidos, analizando tanto las ventajas como las desventajas de cada enfoque.

¿Es la nube realmente más barata que on-premise?

Uno de los argumentos más comunes a favor de las soluciones en la nube, como Azure SQL Database y SQL Server en IaaS (Azure VM), es que son más baratas que las soluciones on-premise. Pero, ¿es esto siempre cierto? La respuesta corta es: depende. La realidad es que en muchos casos, las empresas descubren que los costes a largo plazo de la nube pueden exceder a los de las soluciones tradicionales on-premise, especialmente si no se gestionan adecuadamente. De hecho, he visto cómo algunas empresas han comenzado a reconsiderar su migración a la nube debido a las crecientes facturas de servicios como Azure.

Comparativa de costes: Nube vs. On-Premise

Azure ofrece una estructura de precios que parece atractiva a primera vista, con pagos por uso (pay-as-you-go) que prometen flexibilidad y ahorro. Sin embargo, en la práctica, la realidad de los costes en la nube es muy diferente. Cuando migras a la nube, hay varios factores que rápidamente pueden inflar la factura:

Costes ocultos

Aunque Azure permite escalar hacia arriba y hacia abajo según la demanda, las empresas a menudo subestiman las horas que sus máquinas virtuales (VMs) y bases de datos están en funcionamiento. Servicios como Azure SQL Database, Managed Instance y SQL Server en máquinas virtuales (IaaS) pueden escalar en función de la demanda, pero esto puede resultar en facturas inesperadas si no se implementan estrategias adecuadas de monitoreo y escalado automático​​. Además, para aprovechar estas ventajas, normalmente no basta con subir el código ya desarrollado (lift and shift) sino que hay que hacer adaptaciones para sacar partido a las ventajas de este nuevo paradigma.

Licenciamiento

Mientras que SQL Server on-premise requiere un pago inicial considerable por licencias, las soluciones en la nube suelen requerir un pago constante y por suscripción. Azure Hybrid Benefit promete ayudar a reducir estos costes reutilizando licencias de SQL Server existentes, pero la realidad es que muchas empresas no pueden aprovechar este beneficio de manera efectiva, o descubren que las economías de escala no son tan favorables como se prometía​. Por otro lado, estamos asistiendo lentamente a la adopción del modelo de suscripción en SQL Server on-premise como el modelo de facturación Software Assurance que, a costa de un pago anual, nos proporciona características extra a nuestra licencia.

Costes de salida de datos

Un aspecto frecuentemente pasado por alto es el coste de descarga de datos desde la nube. En algunas plataformas en la nube, los costes de mover datos fuera de la nube, ya sea para hacer backups, migraciones o simplemente para integraciones con sistemas locales, pueden ser significativos. Este es un coste que las soluciones on-premise no tienen.

Rendimiento La batalla entre la nube y on-premise

Ahora bien, el tema del rendimiento es otro punto de fricción importante entre las soluciones en la nube y las soluciones tradicionales. Aquí, la historia no siempre favorece a la nube. Aunque Azure SQL Database y las soluciones SQL Server en IaaS prometen escalabilidad casi infinita, la realidad es que on-premise sigue ofreciendo mejor rendimiento en ciertas cargas de trabajo intensivas.

Escalabilidad y latencia

La capacidad de escalar automáticamente en Azure es una ventaja indiscutible cuando hablamos de escenarios variables, como el comercio electrónico o los servicios de streaming, donde las cargas fluctúan enormemente. Sin embargo, este beneficio tiene un precio en términos de latencia y rendimiento constante. En entornos on-premise, con infraestructura dedicada, la latencia y el rendimiento son más predecibles. Las aplicaciones que requieren baja latencia y un rendimiento constante, como las transacciones financieras o sistemas de bases de datos de alta concurrencia, pueden seguir funcionando mejor en infraestructura on-premise​​.

Por ejemplo, en una base de datos SQL Server alojada en Azure Virtual Machines, aunque puedas optar por discos premium y múltiples núcleos de CPU, la realidad es que la latencia de red entre las capas de aplicación y base de datos sigue siendo un factor limitante. Incluso con las opciones de red más optimizadas en Azure, una base de datos en un entorno on-premise configurada correctamente sigue siendo significativamente más rápida.

La trampa de la escalabilidad «ilimitada»

Uno de los mayores argumentos de venta de Azure es la escalabilidad ilimitada. Pero aquí es donde surge un gran problema: la escalabilidad tiene límites prácticos en cuanto a la optimización de la infraestructura y el coste que estás dispuesto a asumir. A medida que tu base de datos crece y requieres más recursos, los costes también se disparan, y en algunos casos, escalar en on-premise puede ser una mejor solución a largo plazo. Si tu carga de trabajo es predecible y estable, invertir en un sistema robusto on-premise puede ser significativamente más rentable que pagar por la escalabilidad en la nube de manera indefinida.

Además, muchos desconocen que algunas de las estrategias de escalado más avanzadas, como el uso de Elastic Pools en Azure SQL o la implementación de sharded databases, requieren una cantidad considerable de desarrollo adicional para optimizar. Esto significa que la promesa de una escalabilidad sencilla y sin fricciones en Azure no siempre se cumple sin costes adicionales de desarrollo y mantenimiento​. Volvemos a lo que comentábamos antes, subir a la nube implica adaptaciones en el código y, muchas veces, solo nos será rentable para nuevos desarrollos.

Seguridad: ¿Es la nube realmente más segura?

Otro mito popular es que la nube es intrínsecamente más segura que las soluciones on-premise. Si bien Azure ofrece una gama de herramientas de seguridad impresionantes como Azure Security Center, en muchos casos, la seguridad en la nube depende de cómo la configures. Por ejemplo, la gestión de claves de cifrado, la configuración de firewalls y la implementación de políticas de acceso son tareas que, si no se configuran correctamente, pueden dejar a una empresa vulnerable a ataques o fugas de datos​. Es tan compleja esta gestión que, en los últimos años, estamos viendo como crece la demanda de arquitectos cloud en las empresas.

Además, las empresas con grandes cantidades de datos sensibles o que operan en sectores altamente regulados, como el financiero o sanitario, a menudo prefieren seguir manteniendo sus datos on-premise por un mejor control sobre el acceso físico y la localización de los datos. De hecho, muchas empresas todavía desconfían de la nube para manejar datos confidenciales, y optan por mantener una infraestructura híbrida u on-premise para cumplir con las normativas locales de protección de datos.

Por último, a esto habría que añadir las limitaciones en cuanto a cumplimiento normativo. En determinados sectores regulados alojar datos fuera de la infraestructura de la empresa o no está permitido o requiere de una carga burocrática elevada. Y aún siendo posible, hay que extremar las precauciones y elegir bien las zonas geográficas donde se van a alojar los datos para no incurrir en problemas legales.

¿Hacia dónde vamos?

Para mi está claro, el futuro es híbrido. A pesar de las ventajas que ofrece la nube, está claro que no es la panacea para todas las situaciones. Es aquí donde el modelo híbrido se convierte en una solución inteligente para muchas empresas. El uso de bases de datos SQL Server en Azure, combinado con una infraestructura on-premise bien gestionada, permite aprovechar lo mejor de ambos mundos. Puedes tener la flexibilidad de la nube para cargas de trabajo variables, al mismo tiempo que mantienes un rendimiento consistente y control total sobre los datos más sensibles en entornos locales.

El debate no se trata de «nube vs. on-premise», sino de cuándo y cómo aprovechar cada tecnología de manera efectiva. Por ejemplo, Azure Arc permite extender las capacidades de administración de Azure a entornos on-premise y otros entornos en la nube, facilitando una verdadera experiencia híbrida. Esto permite a las empresas beneficiarse de las herramientas de administración avanzada de Azure, mientras siguen utilizando su infraestructura local para cargas críticas.

Conclusión

La nube tiene ventajas indiscutibles en términos de flexibilidad, facilidad de escalado y disponibilidad global, pero eso no significa que sea la mejor opción para todas las empresas o todas las cargas de trabajo. Los costes y el rendimiento de las soluciones en la nube no siempre superan a las soluciones on-premise, especialmente cuando hablamos de cargas de trabajo predecibles o sensibles a la latencia. Como profesionales de bases de datos, debemos ser críticos y cuidadosos al considerar qué opción es la mejor para nuestros clientes o nuestras empresas.

La clave está en evaluar las necesidades específicas y no dejarse llevar por el bombo publicitario de la nube ni por la comodidad que nos dan años de experiencia on-premise. La mejor solución sigue siendo aquella que esté alineada con los objetivos de negocio, y esto podría implicar el uso de la nube, de soluciones on-premise, o de un enfoque híbrido.

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, 0 comentarios

KQL y Kusto DB para análisis Real-Time

Hoy quiero hablaros de KQL (Kusto Query Language) y las bases de datos Kusto disponibles en Azure y en el ecosistema de Microsoft Fabric. Estas bases de datos KQL son una herramienta clave para el análisis de grandes volúmenes de datos en tiempo real. Estas tecnologías están diseñadas para gestionar datos masivos de forma eficiente, permitiendo a los usuarios realizar consultas rápidas y complejas sobre registros de datos, logs y telemetría.

Introducción a KQL y Kusto DB en Fabric

Primero de todo, si es la primera vez que oyes hablar de esto, veamos que es KQL. KQL es el lenguaje de consulta utilizado por Azure Data Explorer y las bases de datos Kusto, especialmente útiles en escenarios como monitorización, análisis de logs y análisis de grandes conjuntos de datos. Microsoft Fabric, que incluye servicios como Synapse y Power BI, ha integrado estas herramientas para potenciar su capacidad de análisis en tiempo real. Esta tecnología permite a los usuarios realizar consultas y análisis de registros masivos con eficiencia, algo crítico para sistemas con grandes volúmenes de datos, como aplicaciones empresariales, infraestructuras TI y soluciones de IoT.

Una de las principales ventajas de KQL es su simplicidad y velocidad. A diferencia de SQL, que está optimizado para operaciones transaccionales, KQL se especializa en análisis y consultas sobre flujos masivos de datos. La base de datos Kusto, que soporta KQL, es una base de datos columnar altamente optimizada para la ingesta rápida de datos y consultas ad-hoc.

Fundamentos de KQL

KQL es un lenguaje declarativo y, aunque tiene similitudes con SQL en cuanto a la estructura de las consultas, es mucho más adecuado para escenarios de análisis de grandes volúmenes de datos. Las consultas en KQL siguen un flujo lógico que permite filtrar, agregar, ordenar y transformar datos de manera eficiente.

  • Filtros: La capacidad de filtrar grandes volúmenes de datos rápidamente es fundamental en KQL. A través de operadores como where, es posible reducir drásticamente el conjunto de datos con condiciones sencillas o complejas.
  • Agregación: KQL soporta agregaciones avanzadas como sumas, conteos y promedios, utilizando funciones como summarize para realizar análisis rápidos sobre millones de registros.
  • Uniones y Transformaciones: Con join, se pueden realizar combinaciones entre tablas, algo esencial para análisis más detallados que requieren cruzar múltiples fuentes de datos.

Por ejemplo, una consulta básica para filtrar y agregar datos en KQL podría verse así:

En este ejemplo, se filtran los registros de logs de las últimas 24 horas, se agrupan en intervalos de un día y se ordenan por el tiempo.

Kusto DB: La base de datos columnar en Fabric

Kusto es la base de datos subyacente que soporta las consultas en KQL. Esta tecnología se desarrolló para gestionar grandes cantidades de datos de telemetría y logs, proporcionando respuestas rápidas y escalabilidad masiva.

Kusto está optimizado para la ingesta rápida de datos, permitiendo el almacenamiento columnar y la compresión eficiente. Su diseño está pensado para consultas sobre millones de filas de datos de manera eficiente, algo que no siempre es posible con bases de datos relacionales tradicionales.

Ingesta y procesamiento en tiempo real con KQL

Una de las principales fortalezas de Kusto DB es su capacidad para la ingesta de datos en tiempo real. Esta característica es crucial en escenarios donde los datos se generan continuamente, como en la monitorización de aplicaciones, la ciberseguridad o el seguimiento de infraestructuras. Kusto utiliza tecnologías avanzadas de almacenamiento columnar, permitiendo la segmentación eficiente de los datos y consultas optimizadas.

Microsoft Fabric aprovecha esta tecnología para análisis de datos en tiempo real, lo cual es vital para empresas que necesitan monitorizar sistemas críticos o tomar decisiones basadas en flujos de datos en tiempo real.

Escalabilidad Horizontal

Kusto es una base de datos distribuida que, igual que la mayoría de soluciones de servicios en la nube, está diseñada para escalar horizontalmente de manera eficiente. Esto significa que a medida que aumenta el volumen de datos, Kusto puede expandirse fácilmente para manejar la carga adicional sin sacrificar el rendimiento. Esta arquitectura es ideal para grandes implementaciones empresariales donde el volumen de datos crece de manera exponencial.

En Microsoft Fabric, Kusto se integra perfectamente con otros servicios, como Azure Synapse y Power BI, lo que permite crear soluciones de análisis completas que van desde la ingesta de datos hasta la visualización y el análisis en tiempo real.

Integración de Kusto DB con Microsoft Fabric

En Microsoft Fabric, Kusto DB no actúa de manera aislada, sino que está profundamente integrado con otros componentes clave de la plataforma de datos de Microsoft. Esto incluye la capacidad de ingerir datos desde múltiples fuentes con Dataflows Gen2, procesarlos con notebooks y visualizarlos en herramientas como Power BI o Microsoft Synapse, por ejemplo.

Sinergia con Power BI y Synapse

Power BI, la plataforma de visualización de datos de Microsoft, se puede conectar directamente a Kusto DB, permitiendo crear dashboards y reportes interactivos en tiempo real basados en los datos almacenados. Además, KQL puede utilizarse dentro de Synapse para análisis más detallados, integrando las capacidades de análisis en tiempo real de Kusto con los procesos de análisis de datos más tradicionales.

Por ejemplo, un escenario común es el análisis de logs de ciberseguridad en una gran infraestructura. Los datos de los logs se ingieren en tiempo real en Kusto DB, donde se procesan utilizando KQL. Los resultados pueden visualizarse directamente en Power BI, lo que permite a los equipos de seguridad reaccionar rápidamente ante cualquier anomalía o amenaza detectada.

Casos de uso de KQL en el mundo real

El uso de KQL y Kusto DB en Fabric está especialmente extendido en industrias que necesitan monitorización y análisis en tiempo real de grandes volúmenes de datos. Algunos ejemplos clave incluyen:

  • Monitorización de Aplicaciones en la Nube: Las empresas que gestionan aplicaciones distribuidas en la nube pueden utilizar Kusto DB para almacenar y analizar logs de rendimiento y errores en tiempo real.
  • Seguridad y Cumplimiento: Como ya hemos visto, las organizaciones pueden usar KQL para analizar logs de seguridad, identificando patrones de acceso no autorizados o ataques potenciales. El análisis en tiempo real es esencial para minimizar el impacto de brechas de seguridad.
  • IoT y Telemetría Industrial: Con cada vez más datos provenientes de dispositivos IoT, Kusto permite gestionar y analizar grandes flujos de datos generados por sensores industriales, permitiendo a las empresas mejorar su eficiencia operativa y detectar fallos antes de que se conviertan en problemas.

Conclusión

KQL y Kusto DB son herramientas poderosas dentro del ecosistema de Microsoft Fabric, ofreciendo capacidades de análisis en tiempo real que son esenciales para las empresas modernas. La capacidad de manejar grandes volúmenes de datos, junto con la integración con otras herramientas como Power BI y Synapse, hace que Kusto sea una opción ideal para escenarios de monitorización y análisis de datos masivos. A medida que las empresas continúan generando más datos, tecnologías como KQL y Kusto seguirán desempeñando un papel crucial en la transformación digital.

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, Otros, Power BI, 1 comentario

UPDATE STATISTICS vs sp_updatestats en SQL Server

Como vimos en el pasado artículo, cuando gestionamos bases de datos en SQL Server, uno de los aspectos más importantes es asegurarnos de que las estadísticas están actualizadas. Las estadísticas son fundamentales para que el optimizador de consultas del motor de SQL Server pueda tomar decisiones eficientes sobre cómo ejecutar las consultas. SQL Server nos proporciona varias formas de actualizar estas estadísticas, y dos de las más comunes son el comando UPDATE STATISTICS y el procedimiento almacenado sp_updatestats. En este artículo, vamos a analizar a fondo las diferencias entre ambos, cómo y cuándo utilizarlos, y qué impacto tienen en el rendimiento general de nuestras bases de datos.

Importancia de las estadísticas en SQL Server

Las estadísticas en SQL Server son colecciones de datos que describen la distribución de valores en una o más columnas de una tabla o índice. Estas estadísticas ayudan al optimizador de consultas a estimar la cantidad de filas que devolverá una consulta, lo que a su vez le permite seleccionar los planes de ejecución más eficientes.

Cuando las estadísticas están desactualizadas, el optimizador puede tomar decisiones incorrectas sobre los planes de ejecución, lo que provoca un rendimiento deficiente en las consultas. De ahí la importancia de mantenerlas actualizadas, especialmente en bases de datos con un alto volumen de inserciones, actualizaciones o eliminaciones de datos.

¿Qué es UPDATE STATISTICS?

El comando UPDATE STATISTICS es una instrucción explícita que actualiza las estadísticas para una tabla o índice en particular. Nos ofrece un control muy granular sobre qué estadísticas actualizar y cómo hacerlo. Podemos especificar un conjunto de opciones que nos permiten, por ejemplo, actualizar las estadísticas basadas en un muestreo de datos o una recolección completa de todos los datos.

Sintaxis básica de UPDATE STATISTICS

Para actualizar una estadística en concreto podemos usar el comando UPDATE STATISTICS con la siguiente sintaxis:

Sin embargo, podemos necesitar actualizar todas las estadísticas de una tabla llamada en concreto, en ese caso escribiremos:

Y si queremos actualizar una estadística específica de un índice, podríamos usar el nombre del indice en vez de el nombre de la estadística:

El comando UPDATE STATISTICS también nos permite utilizar varias opciones avanzadas como FULLSCAN, SAMPLE, y RESAMPLE, que determinan el método que SQL Server utiliza para actualizar las estadísticas.

  • FULLSCAN fuerza a SQL Server a leer todas las filas de la tabla para actualizar las estadísticas.
  • SAMPLE nos permite definir un porcentaje o número de filas de la tabla que se usarán para actualizar las estadísticas.
  • RESAMPLE reutiliza las configuraciones de muestreo anteriores para actualizar las estadísticas.

Casos de uso de UPDATE STATISTICS

El uso de UPDATE STATISTICS es apropiado cuando necesitamos un control fino sobre el proceso de actualización de estadísticas. Por ejemplo en bases de datos críticas. En entornos de producción donde el rendimiento es crucial, y necesitamos asegurarnos de que las estadísticas de ciertas tablas grandes o muy consultadas se actualizan con precisión. Otro caso de uso es con tablas con datos muy volátiles. Si tenemos tablas que cambian frecuentemente, como las que contienen datos transaccionales, las estadísticas pueden quedar obsoletas rápidamente. En estos casos, podemos forzar la actualización periódica de las estadísticas con UPDATE STATISTICS.

Limitaciones de UPDATE STATISTICS

La principal desventaja de UPDATE STATISTICS es que requiere que seleccionemos manualmente las tablas o índices que deben ser actualizados. Esto puede ser laborioso en bases de datos con muchas tablas y estadísticas. Además, si no seleccionamos las estadísticas adecuadas, podríamos pasar por alto aquellas que se han desactualizado, lo que afectaría el rendimiento.

¿Qué es sp_updatestats?

sp_updatestats es un procedimiento almacenado proporcionado por SQL Server que actualiza todas las estadísticas en la base de datos actual que hayan sido marcadas como obsoletas. Este procedimiento es mucho más conveniente cuando queremos actualizar las estadísticas de toda la base de datos de forma masiva y automática, sin tener que preocuparnos por cada tabla o índice en particular.

Cómo funciona sp_updatestats

Cuando ejecutamos sp_updatestats, SQL Server examina todas las tablas y determina qué estadísticas deben actualizarse en función de la propiedad modification_counter (contador de modificaciones). Solo las estadísticas que hayan sufrido cambios significativos (según los algoritmos internos de SQL Server) serán actualizadas, lo que optimiza el uso de los recursos del servidor. Para ejecutarlo simplemente usamos:

Al hacerlo, SQL Server actualiza automáticamente las estadísticas necesarias sin necesidad de especificar tablas, índices o configuraciones adicionales.

Casos de uso de sp_updatestats

El uso de sp_updatestats es más apropiado cuando necesitamos realizar una actualización general de las estadísticas en toda la base de datos. Algunos ejemplos de uso incluyen el mantenimiento periódico o las bases de datos con poca actividad.

En bases de datos grandes, donde no queremos revisar manualmente todas las tablas o índices, podemos usar sp_updatestats como parte de nuestras tareas programadas de mantenimiento para asegurarnos de que las estadísticas estén razonablemente actualizadas. Por el contrario, si nuestras bases de datos no experimentan muchos cambios de datos, sp_updatestats puede sernos suficiente para mantener las estadísticas actualizadas sin un impacto significativo en el rendimiento.

Limitaciones de sp_updatestats

Aunque sp_updatestats es conveniente, no nos ofrece el mismo nivel de control que UPDATE STATISTICS. Al ser un procedimiento almacenado, SQL Server decide qué estadísticas actualizar basándose en su propio criterio, lo que puede no ser siempre ideal en situaciones donde necesitamos precisión y control. Además, puede no actualizar todas las estadísticas que en realidad lo necesitan si los cambios en los datos no alcanzan los umbrales establecidos por SQL Server.

Diferencias clave entre UPDATE STATISTICS y sp_updatestats

Como acabamos de ver, los métodos de actualización manual de estadísticas tienen sus diferencias, lo que hace que cada uno sea indicado para un caso concreto. 

Mientras que UPDATE STATISTICS nos permite un control muy específico sobre qué estadísticas actualizar, sp_updatestats es una solución más generalizada.

Por otro lado, sp_updatestats es menos intensivo en términos de recursos, ya que solo actualiza las estadísticas que SQL Server considera desactualizadas, mientras que UPDATE STATISTICS puede ser más intensivo, especialmente si usamos opciones como FULLSCAN.

En cuanto a la sencillez, sp_updatestats es mucho más sencillo de utilizar en escenarios donde no necesitamos un control tan granular sobre las estadísticas. Sin embargo, si necesitamos actualizar solo ciertas tablas o índices críticos, UPDATE STATISTICS es la mejor opción.

Por último, sp_updatestats, gracias a sus características, es más adecuado para procesos automáticos de mantenimiento, mientras que UPDATE STATISTICS puede necesitar más intervención manual, dependiendo del caso de uso.

Cuándo utilizar cada uno

La elección entre UPDATE STATISTICS y sp_updatestats depende de las necesidades específicas de nuestro entorno de base de datos. Si estamos administrando una base de datos crítica con muchas consultas y necesitamos un rendimiento óptimo en tablas específicas, UPDATE STATISTICS con opciones avanzadas como FULLSCAN es la mejor opción. Esto garantiza que las estadísticas se actualicen con precisión y se basen en datos reales y completos pero tendrá un alto coste en recursos.

Por otro lado, si buscamos un enfoque menos manual y necesitamos actualizar las estadísticas de toda la base de datos sin dedicar demasiado tiempo a configurar el proceso, sp_updatestats es una opción rápida y eficaz, especialmente cuando se utiliza en combinación con tareas programadas de mantenimiento.

Conclusión

Mantener las estadísticas actualizadas en SQL Server es una parte fundamental del mantenimiento de la base de datos para asegurar el rendimiento óptimo de las consultas. Mientras que UPDATE STATISTICS nos da un control detallado sobre qué estadísticas actualizar y cómo hacerlo, sp_updatestats ofrece una solución más automatizada y general para mantener la base de datos en buen estado.

La clave está en conocer cuándo utilizar cada enfoque. Si gestionamos bases de datos con altos volúmenes de datos o con requisitos específicos de rendimiento, optar por UPDATE STATISTICS puede ser lo más adecuado. Sin embargo, en escenarios de mantenimiento general, sp_updatestats nos proporciona una forma conveniente y eficaz de mantener las estadísticas actualizadas sin esfuerzo manual adicional. Como siempre, es fundamental realizar pruebas y monitorear el impacto de estas operaciones en el rendimiento de nuestras consultas y en el uso de los recursos del sistema.

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, 0 comentarios

Actualización de estadísticas en SQL Server

Las estadísticas en SQL Server son fundamentales para que el optimizador de consultas pueda generar planes de ejecución eficientes. Sin ellas, el rendimiento de las consultas se vería gravemente afectado, ya que el motor de base de datos se basa en estas estadísticas para estimar cuántas filas serán procesadas, seleccionar los índices correctos, y en general, tomar decisiones optimizadas. En este artículo, veremos los diferentes tipos de actualización de estadísticas en SQL Server: las actualizaciones automáticas, las automáticas asimétricas y las manuales.

¿Qué son las estadísticas en SQL Server?

Antes de entrar en los tipos de actualización de estadísticas, es importante tener claro qué son las estadísticas en SQL Server. Estas, son colecciones de metadatos que describen la distribución de los valores en una o más columnas de una tabla o índice. SQL Server crea y mantiene estas estadísticas para ayudar al optimizador de consultas a evaluar de manera precisa el costo de ejecutar una consulta.

Una estadística consta de un histograma, que es un resumen de los valores en la columna, junto con un conjunto de densidades que indican cuán distribuidos están esos valores. Esto le permite a SQL Server hacer predicciones precisas sobre las operaciones de búsqueda, escaneo y uniones entre tablas.

Actualización automática de estadísticas en SQL Server

SQL Server incluye una opción que permite que las estadísticas se actualicen automáticamente cuando el sistema detecta que han quedado desfasadas. Esta es la opción, configurable a nivel de base de datos, y se conoce como AUTO_UPDATE_STATISTICS y está activada por defecto.

¿Cuándo se actualizan automáticamente?

Las estadísticas se actualizan automáticamente cuando SQL Server detecta que ha habido un cambio significativo en la distribución de los datos en una tabla o índice. De manera general, SQL Server utiliza un umbral basado en el número de filas modificadas:

  1. Si una tabla tiene menos de 500 filas, las estadísticas se actualizan después de que 500 modificaciones ocurran en la tabla.
  2. Si una tabla tiene más de 500 filas, se actualizan cuando el número de filas modificadas supera el 20% de la tabla más 500 filas.

En versiones anteriores a SQL Server 2016, este umbral era distinto y podía ser bastante ineficiente, especialmente en tablas grandes, ya que requería una cantidad considerable de cambios en los datos para activar la actualización automática. Esto significaba que las estadísticas podían quedarse desactualizadas por un largo tiempo si los cambios en los datos eran graduales.

Beneficios de la actualización automática

El mayor beneficio de las estadísticas automáticas es que reduce la necesidad de intervención manual. El sistema se encarga de mantener las estadísticas al día, lo que es útil en entornos donde no se dispone de un DBA que monitorice constantemente las operaciones. Sin embargo, en ciertas situaciones, especialmente cuando el volúmen de datos empieza a crecer, este mecanismo puede no ser suficiente para garantizar el rendimiento óptimo, lo que nos obliga a añadir otros mecanismos de actualización adicionales.

Actualización automática asimétrica de estadísticas

SQL Server introdujo en versiones recientes una característica conocida como Asynchronous Statistics Update o AUTO_UPDATE_STATISTICS_ASYNC, que se traduce en actualizaciones automáticas de estadísticas en segundo plano. Esta característica permite que las estadísticas se actualicen de manera asíncrona, es decir, sin detener la ejecución de la consulta que disparó la necesidad de actualización.

¿Cómo funcionan las actualizaciones asimétricas?

Cuando el modo AUTO_UPDATE_STATISTICS_ASYNC está habilitado, SQL Server no espera a que las estadísticas se actualicen antes de ejecutar la consulta. En lugar de detenerse y esperar a que las estadísticas se regeneren, la consulta se ejecuta utilizando el plan basado en las estadísticas antiguas. Luego, en segundo plano, SQL Server actualiza las estadísticas para futuras consultas.

Este enfoque tiene varias ventajas, ya que evita que las consultas sufran retardos debido a la actualización de estadísticas en tablas grandes, lo que puede ser un proceso costoso y demorado. Sin embargo, estaremos ejecutando las consultas con un plan subóptimo que podría afectar gravemente al rendimiento.

Cuándo utilizar las actualizaciones asimétricas

Las actualizaciones asimétricas son especialmente útiles en escenarios donde se prioriza la latencia de las consultas sobre la exactitud inmediata de las estadísticas. Por ejemplo, en sistemas OLTP de alta concurrencia donde la velocidad de respuesta es crítica, habilitar las actualizaciones asimétricas puede mejorar la experiencia del usuario.

No obstante, hay que tener cuidado, ya que la primera consulta que se ejecute con estadísticas obsoletas podría tener un plan de ejecución subóptimo, lo que afectaría el rendimiento de esa consulta específica. Sin embargo, consultas posteriores, que se ejecuten una vez que esa actualización de estadística haya concluido, deberían beneficiarse de las estadísticas actualizadas.

Actualización manual de estadísticas

Por último, tenemos la opción de actualizar las estadísticas de manera manual. Esto se hace cuando el DBA o el equipo de desarrollo tenemos un control más preciso sobre cuándo y cómo deben actualizarse las estadísticas en el sistema. Las actualizaciones manuales se realizan mediante el comando UPDATE STATISTICS, o utilizando los procedimientos almacenados del sistema como sp_updatestats.

¿Cuándo realizar actualizaciones manuales?

Es recomendable hacer actualizaciones manuales en los siguientes escenarios:

  • Carga masiva de datos: Cuando se insertan, actualizan o eliminan grandes cantidades de datos en una tabla, es probable que las estadísticas se queden desactualizadas antes de que el umbral de actualización automática se alcance. En este caso, actualizar las estadísticas manualmente puede mejorar drásticamente el rendimiento de las consultas subsiguientes.
  • Procesos de ETL: En operaciones de ETL donde se transforman y mueven grandes volúmenes de datos, realizar una actualización manual de estadísticas al final del proceso puede ayudar a asegurar que las consultas que utilicen esos datos optimicen su ejecución.
  • Consultas de bajo rendimiento: Si observamos un descenso significativo en el rendimiento de ciertas consultas, puede ser útil actualizar manualmente las estadísticas para asegurarnos de que el optimizador de consultas tiene información precisa y actualizada sobre la distribución de los datos.

Estrategias de actualización manual

Existen diferentes estrategias para realizar actualizaciones manuales. Una opción es usar el comando UPDATE STATISTICS directamente sobre tablas específicas o sobre todas las tablas de una base de datos. Otra opción más eficiente es utilizar sp_updatestats, que actualiza las estadísticas de todas las tablas que hayan sufrido modificaciones, evitando el coste innecesario de actualizar estadísticas que no requieren actualización.

Además, SQL Server permite configurar el grado de muestreo en las estadísticas mediante el parámetro WITH FULLSCAN, que obliga a SQL Server a escanear todas las filas en lugar de hacer un muestreo. Esto es especialmente útil cuando queremos asegurar la mayor precisión posible, aunque puede ser más costoso en términos de tiempo.

Actualización de estadísticas como parte de un plan de mantenimiento

Aunque las actualizaciones automáticas funcionan bien en la mayoría de los casos sencillos, en cuanto la base de datos y los requerimientos crecen, puede ser recomendable que incluyamos la actualización de estadísticas como parte de nuestros planes de mantenimiento. Esta práctica asegura que las estadísticas estén siempre actualizadas de forma programada, evitando que se queden obsoletas y afecten el rendimiento del sistema.

Implementación de un plan de mantenimiento

El uso de planes de mantenimiento en SQL Server es una estrategia común para tareas recurrentes como la reconstrucción de índices, la limpieza de la base de datos y la actualización de estadísticas. Sin embargo, los planes de mantenimiento estándar de SQL Server a menudo carecen de la flexibilidad y optimización que muchos entornos requieren. Es aquí donde entran los scripts de mantenimiento de Ola Hallengren, ampliamente reconocidos en la comunidad SQL Server por su robustez y capacidad de personalización.

Ola Hallengren ofrece un conjunto de scripts que permiten configurar tareas de mantenimiento, incluida la actualización de estadísticas, de manera muy eficiente. Estos scripts ofrecen un control avanzado sobre cómo y cuándo se deben actualizar las estadísticas, permitiendo especificar opciones como:

  • Tablas específicas: Se pueden actualizar solo las estadísticas de las tablas que lo necesiten, en lugar de hacer un barrido completo de todas las tablas.
  • Opciones de muestreo: El script permite configurar el tipo de muestreo para las estadísticas, lo que ofrece un mayor control sobre el rendimiento y precisión de las actualizaciones.
  • Actualización condicional: El script de Ola Hallengren también permite que las estadísticas se actualicen solo cuando las tablas hayan alcanzado un cierto umbral de modificaciones, lo que evita actualizaciones innecesarias.

Si estás buscando una solución integral y flexible para el mantenimiento de estadísticas, puedes consultar los scripts de Ola Hallengren en su página oficial.

Configuración del script de Ola Hallengren para estadísticas

El script de mantenimiento de Ola Hallengren nos permite programar la actualización de estadísticas con una sintaxis sencilla y múltiples opciones. Un ejemplo básico de uso para actualizar estadísticas sería:

En este ejemplo, se actualizan todas las estadísticas de la base de datos especificada, pero solo aquellas que hayan sido modificadas. Esta opción es excelente para evitar el coste innecesario de actualizar estadísticas que no lo requieren.

Consideraciones y mejores prácticas

El uso adecuado de las actualizaciones automáticas, asimétricas, manuales y mediante planes de mantenimiento depende del contexto y la carga de trabajo del sistema. Algunas recomendaciones incluyen:

  • Mantener activadas las actualizaciones automáticas: En la mayoría de los casos, es recomendable dejar activada la opción AUTO_UPDATE_STATISTICS para que SQL Server mantenga las estadísticas actualizadas sin intervención manual. Esto cubre dignamente la mayoría de los escenarios diarios sin añadir carga administrativa adicional.
  • Utilizar actualizaciones asimétricas en entornos de alta concurrencia: Las actualizaciones asíncronas pueden mejorar el rendimiento en algunos sistemas OLTP donde la velocidad de respuesta es crucial, aunque deben usarse con precaución para evitar planes de ejecución subóptimos. Antes de activar esta opción te recomiendo probarla y ver si realmente es beneficiosa para ti..
  • Incluir las actualizaciones en planes de mantenimiento: Utilizar herramientas avanzadas como los scripts de Ola Hallengren para actualizar estadísticas de forma regular y controlada es una práctica recomendada en entornos críticos o con grandes volúmenes de datos. Esto nos asegura que las estadísticas estén siempre actualizadas, reduciendo el riesgo de que las consultas sufran debido a información desactualizada.

Conclusión

Las estadísticas en SQL Server son fundamentales para el rendimiento de las consultas, y mantenerlas actualizadas es clave para que el optimizador de consultas genere planes de ejecución eficientes. Ya sea que optemos por actualizaciones automáticas, asimétricas, manuales o basadas en un plan de mantenimiento, tener una estrategia clara es esencial para asegurar un rendimiento óptimo en la base de datos.

Si deseas más detalles sobre cómo implementar planes de mantenimiento efectivos o utilizar los scripts de Ola Hallengren para optimizar tus estadísticas, consulta nuestro artículo sobre planes de mantenimiento en SQL Server para obtener una visión completa de cómo automatizar y mejorar estas tareas rutinarias.

 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

Memory Clerks en SQL Server

La memoria es uno de los recursos más importantes en SQL Server. En cualquier entorno de bases de datos, la gestión adecuada de la RAM tiene un impacto directo en el rendimiento, por lo que entender cómo SQL Server distribuye y utiliza la memoria es esencial para optimizar el rendimiento. Una de las herramientas más potentes para analizar el uso de la memoria en SQL Server son los Memory Clerks, estructuras que el motor de base de datos utiliza para clasificar y medir el consumo de memoria en distintas áreas.

En este artículo, explicaré qué son los memory clerks, cómo trabajan y qué podemos aprender de ellos para optimizar la memoria en nuestras instalaciones de SQL Server. A medida que profundizamos en el tema, entenderemos mejor cómo estos componentes nos permiten a los administradores diagnosticar problemas relacionados con la memoria y ajustar las configuraciones para maximizar el rendimiento. O eso espero 🙂

¿Qué son los Memory Clerks?

Los Memory Clerks en SQL Server son componentes encargados de controlar y rastrear el uso de la memoria en diferentes subsistemas del servidor. SQL Server utiliza estos «clerks» o «registradores» de memoria para identificar qué tipo de carga de trabajo o función está consumiendo la RAM y cuánto consume en cada momento. Cada memory clerk agrupa los recursos consumidos en una parte específica del servidor, lo que nos permite hacer un análisis detallado y entender en qué áreas está impactando más el uso de la memoria.

Los clerks no solo controlan el uso de la memoria dinámica, sino también la memoria fija y los buffers que SQL Server utiliza para las diversas operaciones internas. Al proporcionar una visión clara del consumo de memoria, los memory clerks son esenciales para el diagnóstico de problemas de rendimiento y cuellos de botella.

¿Cómo trabajan los Memory Clerks?

Cada vez que una parte de SQL Server requiere memoria, ya sea para una operación de consulta, la compilación de un plan de ejecución o el mantenimiento de índices, el sistema asigna dicha memoria a un clerk específico. Esto asegura que cada subsistema tenga control sobre su propia porción de memoria y pueda gestionar la demanda de recursos de manera adecuada.

Existen diferentes tipos de memory clerks, cada uno de ellos responsable de una parte particular del sistema. Algunos de los clerks más importantes son:

  • CACHESTORE_SQLCP: Encargado de gestionar la memoria utilizada para almacenar planes de ejecución de consultas en caché. Este clerk es clave para optimizar el rendimiento en consultas repetidas.
  • CACHESTORE_OBJCP: Similar al anterior, pero enfocado en el almacenamiento en caché de objetos compilados, como procedimientos almacenados y funciones definidas por el usuario.
  • USERSTORE_SCHEMAMGR: Maneja la memoria utilizada para almacenar metadatos del esquema de las bases de datos.
  • MEMORYCLERK_SQLBUFFERPOOL: Uno de los más importantes, ya que gestiona el Buffer Pool, la zona de memoria donde se almacenan las páginas de datos leídas desde el disco.

Cada uno de estos memory clerks actúa como un “departamento” dentro del servidor que controla cuánta memoria utiliza su sección específica, asegurando que no se consuman recursos de manera desproporcionada y permitiendo una gestión más eficiente de los recursos en general.

Tipos principales de Memory Clerks

Aunque existen muchos tipos de memory clerks en SQL Server (y cada versión nueva más), algunos son especialmente relevantes para la gestión de la memoria. Los más importantes en un entorno típico de bases de datos son los siguientes:

  • MEMORYCLERK_SQLBUFFERPOOL: Como hemos mencionado antes, este clerk es responsable del Buffer Pool. Se encarga de gestionar las páginas de datos que están almacenadas en la memoria RAM y que son esenciales para el rendimiento de las consultas. Su buen funcionamiento es crítico, ya que cualquier problema en este clerk puede derivar en un mayor número de lecturas desde disco, lo que ralentiza considerablemente las operaciones.
  • MEMORYCLERK_SQLSTORENG: Este clerk gestiona la memoria relacionada con el almacenamiento de datos y el motor de almacenamiento. Aquí es donde SQL Server maneja las estructuras de datos de los archivos físicos de las bases de datos.
  • MEMORYCLERK_SQLCLR: Responsable de la memoria utilizada por el Common Language Runtime (CLR) de SQL Server. Si ejecutamos código .NET dentro de SQL Server, como procedimientos almacenados CLR o funciones definidas por el usuario, este clerk gestionará la memoria asignada.
  • MEMORYCLERK_SQLQUERYEXEC: Este clerk gestiona la memoria utilizada para la ejecución de consultas. Se ocupa de los recursos necesarios para ejecutar y optimizar las consultas, incluyendo el almacenamiento temporal de los resultados intermedios.
  • MEMORYCLERK_SQLGENERAL: Este clerk se encarga de la memoria utilizada para operaciones generales que no están categorizadas bajo otros clerks específicos. Incluye operaciones diversas del sistema.

Monitorización

Monitorizar el uso de los memory clerks nos proporciona información valiosa sobre cómo se está distribuyendo la memoria en nuestro servidor. SQL Server ofrece varias formas de acceder a esta información, mi favorita es la vista de gestión dinámica (DMV) sys.dm_os_memory_clerks. Esta vista nos permite ver cuánta memoria está utilizando cada memory clerk en tiempo real, lo que nos ofrece un nivel de detalle profundo para diagnosticar problemas de rendimiento. Un ejemplo de consulta que podemos ejecutar para obtener una visión clara del consumo de memoria por parte de los memory clerks es la siguiente:

Esta consulta nos muestra el tipo de memory clerk y la cantidad de memoria que cada uno está utilizando, ordenados de mayor a menor consumo de memoria. De esta manera, podemos identificar rápidamente qué área del sistema está consumiendo más recursos y si hay algún subsistema que esté utilizando más memoria de la esperada.

Además de esta DMV, SQL Server proporciona otras vistas de gestión como sys.dm_os_sys_memory y sys.dm_os_process_memory, que nos permiten analizar el estado general de la memoria del sistema y la memoria utilizada por el proceso de SQL Server.

Diagnóstico de problemas de rendimiento con Memory Clerks

Cuando un servidor presenta problemas de rendimiento relacionados con la memoria, los memory clerks son una de las primeras áreas que me gusta analizar. Un uso desproporcionado de memoria en algún clerk puede ser un indicativo claro de que algo no está funcionando correctamente. Por ejemplo, si el CACHESTORE_SQLCP está consumiendo una cantidad anormal de memoria, podría significar que el sistema está almacenando demasiados planes de ejecución en caché, lo que podría requerir ajustes en los parámetros de configuración del Plan Cache.

Por otro lado, si el MEMORYCLERK_SQLBUFFERPOOL está saturado, probablemente estemos ante un escenario en el que el sistema está lidiando con demasiadas páginas de datos y no hay suficiente memoria para almacenarlas. En este caso, aumentar la memoria física o implementar la Buffer Pool Extension podría ser una solución viable.

El análisis continuo de los memory clerks nos proporciona las herramientas necesarias para realizar ajustes proactivos y optimizar la configuración del servidor, mejorando así el rendimiento general.

Conclusión

Los Memory Clerks son una de las claves para entender cómo SQL Server gestiona la memoria y optimizar el rendimiento en entornos de bases de datos. Estos componentes permiten una visión detallada del uso de memoria en distintas áreas del sistema, lo que resulta esencial para diagnosticar problemas de rendimiento y ajustar la configuración del servidor de manera efectiva.

Al comprender cómo funcionan los memory clerks y monitorizar su uso de manera regular, los administradores de bases de datos podemos asegurarnos de que SQL Server está utilizando la memoria de forma óptima. Esto nos permite resolver problemas relacionados con el consumo de memoria antes de que afecten gravemente al rendimiento del sistema y garantizar que nuestros entornos de bases de datos operen con la máxima eficiencia posible.

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, 0 comentarios