Autor: Oscar Morán

Descarga gratis SQL SERVER 2019 y sus versiones

Descarga gratis SQL SERVER 2019 y sus versiones

SQL Server 2019 viene en varias ediciones, y cada una está diseñada para diferentes escenarios de uso, desde desarrollo personal hasta entornos empresariales. Aquí te detallo las diferencias más relevantes entre las principales versiones:


1. Edición Enterprise

  • Destinada a grandes empresas.
  • Características clave:
    • Sin límites de escalabilidad: Admite el máximo de procesadores y memoria del sistema operativo.
    • Funciones avanzadas de rendimiento: Incluye características como Intelligent Query Processing (procesamiento inteligente de consultas) y Big Data Clusters.
    • Alta disponibilidad: Soporte completo para Always On Availability Groups (grupos de disponibilidad Always On).
    • Seguridad avanzada: Soporte para encriptación Always Encrypted, enmascaramiento dinámico de datos y auditoría.
    • Herramientas avanzadas de análisis: Incluye PolyBase, análisis de big data y soporte para bases de datos distribuidas.
    • Machine Learning: Integración con modelos de Python y R directamente en el servidor.

2. Edición Standard

  • Para medianas empresas o aplicaciones con necesidades moderadas.
  • Características clave:
    • Escalabilidad limitada: Soporta hasta 24 núcleos de CPU y 128 GB de RAM.
    • Alta disponibilidad limitada: Incluye Always On Basic Availability Groups, con ciertas restricciones en comparación con la edición Enterprise.
    • Funciones de análisis: Soporte para PolyBase y algunas capacidades analíticas básicas.
    • Funcionalidades esenciales de seguridad: Incluye las características más importantes, como el enmascaramiento dinámico de datos, pero con algunas restricciones.

3. Edición Developer

  • Para desarrolladores que quieren aprender y probar las funciones de SQL Server Enterprise.
  • Características clave:
    • Mismas funciones que Enterprise, pero no para uso en producción.
    • Ideal para entornos de desarrollo y prueba.
    • Gratuita, pero limitada únicamente a entornos no comerciales.

4. Edición Express

  • Diseñada para pequeñas aplicaciones o propósitos educativos.
  • Características clave:
    • Gratuita, pero con limitaciones en la capacidad:
      • 1 GB de memoria máxima por instancia.
      • 10 GB de almacenamiento máximo por base de datos.
      • 1 socket de CPU o 4 núcleos como máximo.
    • Sin soporte avanzado como Always On, PolyBase o Big Data Clusters.
    • Ideal para pequeñas aplicaciones, como soluciones de escritorio o web ligeras.

5. Edición Big Data Clusters

  • Diseñada para manejar grandes volúmenes de datos y análisis avanzado.
  • Características clave:
    • Integra Apache Spark y HDFS para el manejo de big data.
    • Permite la consulta de datos estructurados y no estructurados en clústeres distribuidos.
    • Soporte para análisis avanzado y aprendizaje automático en grandes volúmenes de datos.

Comparativa rápida:

FunciónEnterpriseStandardDeveloperExpress
Escalabilidad de CPU/RAMMáximo del sistema24 núcleos/128 GBIgual que Enterprise1 GB RAM/10 GB DB
Alta disponibilidadCompleto (Always On)BásicoCompletoNo disponible
Big Data ClustersNoNo
PolyBaseNo
Machine LearningLimitadoNo
CostoPagoPagoGratuito (dev)Gratuito

¿Qué edición elegir?

  • Enterprise: Si necesitas rendimiento y funciones avanzadas en un entorno empresarial crítico.
  • Standard: Si manejas cargas de trabajo medianas con presupuestos moderados.
  • Developer: Si estás aprendiendo o desarrollando, sin intenciones de usarlo en producción.
  • Express: Para aplicaciones ligeras o propósitos educativos.

Conociendo la Configuración a Nivel de Servidor en SQL Server

SQL: ¿Configurar los Archivos LDF y MDF en Unidades Distintas es Importante?

Conociendo las Trazas Habilitadas en SQL Server: Guía DBAs

Error 15025 SQL Server. The server principal already exists

Mejores cuentos de vikingos

SQL server Rebuild vs Reorganize

SQL Server Rebuild vs Reorganize

SQL Server Rebuild vs Reorganize, en SQL Server, es posible realizar tanto un rebuild como un reorganize sobre los índices. Estas son operaciones relacionadas con el mantenimiento de los índices en la base de datos, y ambas tienen el objetivo de mejorar el rendimiento de las consultas optimizando los índices. Sin embargo, funcionan de manera diferente y se utilizan en diferentes situaciones dependiendo del grado de fragmentación de los índices.

1. Rebuild (Reconstruir Índices)

  • Qué hace: El comando rebuild crea un índice completamente nuevo desde cero, eliminando el índice existente y reconstruyéndolo. Este proceso reorganiza los datos físicamente en las páginas de datos de la base de datos, eliminando cualquier fragmentación.
  • Cuándo usarlo: Se recomienda realizar un rebuild cuando la fragmentación de un índice es superior al 30%.
  • Efecto en el sistema: Esta operación es más intensiva que el reorganize, ya que requiere más recursos (CPU, memoria, disco) y bloquea el índice durante la operación, aunque en las versiones recientes de SQL Server, se puede realizar un rebuild en línea para reducir el impacto.
Comando:

sql

ALTER INDEX nombre_del_indice
ON nombre_de_la_tabla
REBUILD;
  • Pros:
    • Elimina completamente la fragmentación.
    • Compacta las páginas de datos.
  • Contras:
    • Consume más recursos.
    • Puede bloquear el acceso a los datos durante la operación.

2. Reorganize (Reorganizar Índices)

  • Qué hace: El comando reorganize realiza una reorganización de los fragmentos de un índice existente. Es una operación menos agresiva que el rebuild, ya que solo reorganiza los datos dentro de las páginas existentes en lugar de recrear el índice desde cero. Reorganize también compacta los niveles del índice.
  • Cuándo usarlo: Se recomienda hacer un reorganize cuando la fragmentación es entre el 5% y 30%.
  • Efecto en el sistema: Es una operación menos intensiva y se puede realizar sin bloquear el índice, permitiendo que las consultas sigan ejecutándose.
Comando:

ALTER INDEX nombre_del_indice
ON nombre_de_la_tabla
REORGANIZE;
  • Pros:
    • Consume menos recursos y no bloquea el índice.
    • Se puede realizar mientras los usuarios acceden a los datos.
  • Contras:
    • No elimina completamente la fragmentación, solo la reduce.

Cuándo usar Rebuild vs Reorganize

  • Menos del 5% de fragmentación: No se necesita mantenimiento.
  • Entre 5% y 30% de fragmentación: Es recomendable hacer un reorganize.
  • Más del 30% de fragmentación: Se recomienda hacer un rebuild.

Ver fragmentación de los índices

Antes de decidir si hacer un rebuild o reorganize, es útil medir el nivel de fragmentación con la siguiente consulta:

SELECT 
    dbschemas.[name] AS 'Schema',
    dbtables.[name] AS 'Table', 
    dbindexes.[name] AS 'Index', 
    indexstats.avg_fragmentation_in_percent
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
    INNER JOIN sys.tables dbtables ON dbtables.[object_id] = indexstats.[object_id]
    INNER JOIN sys.schemas dbschemas ON dbtables.[schema_id] = dbschemas.[schema_id]
    INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
    AND indexstats.index_id = dbindexes.index_id
WHERE 
    indexstats.database_id = DB_ID()
    AND dbindexes.[name] IS NOT NULL
ORDER BY 
    avg_fragmentation_in_percent DESC;

Resumen:

  • Rebuild: Ideal para fragmentación >30%, más intensivo, elimina completamente la fragmentación.
  • Reorganize: Para fragmentación entre 5%-30%, menos intensivo, no elimina toda la fragmentación, pero es más rápido y amigable para el sistema.

Guía Completa para Implementar FULLTEXT en SQL

EXEC sp_change_users_login SQL SERVER

Para que una tabla tenga FULLTEXT SQL

Procedimientos Almacenados Temporales en SQL Server

Tutorial completo Data Migration Assistant SQL Server

Extracción de las Vistas en SQL Server

alto consumo cpu sql server

SQL Server está causando un alto uso de CPU

SQL Server está causando un alto uso de CPU, el alto uso de CPU en un servidor es un síntoma claro de que algo no anda bien. Cuando se trata de SQL Server, una base de datos que suele manejar grandes volúmenes de datos y múltiples transacciones simultáneas, es crucial determinar si este es el responsable del problema. Un uso elevado de CPU puede afectar gravemente el rendimiento de la base de datos y, por ende, el rendimiento de las aplicaciones que dependen de ella. A continuación, te mostramos cómo puedes verificar si SQL Server es la causa del alto uso de CPU utilizando diferentes herramientas y métodos.

Importancia de monitorear el uso de CPU en SQL Server

El rendimiento del CPU es vital para cualquier servidor que ejecute SQL Server, ya que este proceso está directamente relacionado con la capacidad de la base de datos para procesar consultas y transacciones. Un CPU sobrecargado puede provocar tiempos de respuesta lentos, bloqueos, y en casos extremos, la inestabilidad del sistema. Por ello, monitorear y diagnosticar adecuadamente el uso del CPU es un paso crucial para garantizar el correcto funcionamiento de tu entorno SQL Server.

alto consumo cpu sql server

Herramientas y métodos para verificar el uso de CPU de SQL Server

1. Administrador de Tareas

El Administrador de Tareas de Windows es una herramienta básica pero útil para obtener una visión rápida del uso de CPU. Para verificar si SQL Server está utilizando una cantidad significativa de CPU, sigue estos pasos:

  • Abre el Administrador de Tareas: Puedes hacerlo presionando Ctrl + Shift + Esc o haciendo clic derecho en la barra de tareas y seleccionando «Administrador de Tareas».
  • Ve a la pestaña «Procesos»: Aquí verás una lista de todos los procesos que se están ejecutando en tu servidor.
  • Busca «SQL Server Windows NT-64 Bit»: Este es el proceso correspondiente a SQL Server.
  • Verifica el valor de la columna CPU: Si este valor está cerca del 100%, es una señal de que SQL Server está consumiendo una gran cantidad de recursos de CPU.

Aunque esta herramienta es útil para una inspección rápida, no proporciona una visión detallada del comportamiento del CPU, lo que nos lleva a utilizar herramientas más avanzadas.

2. Monitor de Rendimiento y Recursos (perfmon)

El Monitor de Rendimiento y Recursos, conocido como perfmon, es una herramienta más avanzada que permite una monitorización y análisis más detallado del uso de recursos en el servidor. Para utilizar perfmon para verificar el uso de CPU por parte de SQL Server, sigue estos pasos:

  1. Abre el Monitor de Rendimiento: Puedes abrirlo escribiendo perfmon en la barra de búsqueda de Windows y seleccionando la opción que aparece.
  2. Agrega contadores específicos:
    • Haz clic en el icono de “+” para agregar contadores.
    • Busca y selecciona el contador Process/%User Time y Process/%Privileged Time.
    • En la lista de instancias, selecciona sqlservr.
  3. Monitorea el comportamiento: Con los contadores añadidos, puedes observar cómo SQL Server está utilizando la CPU. Estos contadores te ayudarán a determinar si el proceso de SQL Server está contribuyendo significativamente al uso de CPU.

3. Script de PowerShell

Para quienes prefieren o necesitan automatizar el proceso, el uso de PowerShell es una excelente opción. Con PowerShell, puedes capturar datos de los contadores de rendimiento durante un período específico. A continuación, se muestra un script que puedes utilizar para recopilar datos sobre el uso de CPU por parte de SQL Server:





$serverName = $env:COMPUTERNAME
$Counters = @(
    ("\\$serverName" + "\Process(sqlservr*)\% User Time"), ("\\$serverName" + "\Process(sqlservr*)\% Privileged Time")
)
Get-Counter -Counter $Counters -MaxSamples 30 | ForEach {
    $_.CounterSamples | ForEach {
        [pscustomobject]@{
            TimeStamp = $_.TimeStamp
            Path = $_.Path
            Value = ([Math]::Round($_.CookedValue, 3))
        }
        Start-Sleep -s 2
    }
}

Este script recoge datos de los contadores de rendimiento Process/%User Time y Process/%Privileged Time para SQL Server cada dos segundos durante un minuto. Este enfoque te permite obtener un análisis detallado del uso de CPU a lo largo del tiempo, lo que es útil para identificar patrones o picos de carga.

Interpretación de los resultados

Una vez que has recopilado los datos utilizando alguna de las herramientas anteriores, es importante interpretar correctamente los resultados:

  • % User Time: Este valor representa el tiempo que la CPU dedica a ejecutar código en modo de usuario, que incluye todas las aplicaciones como SQL Server. Si este valor es consistentemente mayor al 90%, significa que SQL Server está utilizando la mayor parte de la CPU. Esto podría ser causado por una serie de factores como consultas mal optimizadas, falta de índices o una alta carga de trabajo.
  • % Privileged Time: Este contador mide el tiempo que la CPU dedica a ejecutar instrucciones en modo kernel o privilegiado, lo que incluye la ejecución de controladores del sistema y otros servicios del sistema operativo. Si este valor es mayor al 90%, es probable que el problema esté relacionado con un controlador, software antivirus u otro componente del sistema operativo, no directamente con SQL Server.

Pasos adicionales para solucionar el alto uso de CPU en SQL Server

Si has determinado que SQL Server es el responsable del alto uso de CPU, aquí tienes algunos pasos adicionales que puedes seguir para resolver el problema:

  1. Optimiza las consultas: Revisa las consultas que están consumiendo más recursos. Considera optimizarlas utilizando índices adecuados, reescribiendo consultas complejas o dividiendo grandes transacciones en unidades más pequeñas.
  2. Verifica la configuración de SQL Server: Asegúrate de que la configuración del servidor esté optimizada para el tipo de carga de trabajo que maneja. Esto incluye verificar la memoria asignada a SQL Server, el número de procesadores que puede utilizar, y otros ajustes de configuración.
  3. Actualiza las estadísticas e índices: Mantener actualizadas las estadísticas e índices de la base de datos puede mejorar significativamente el rendimiento de las consultas y, por ende, reducir el uso de CPU.
  4. Investiga otros procesos: Si % Privileged Time es alto, considera investigar otros procesos en el servidor que podrían estar interfiriendo con el rendimiento de SQL Server. Colabora con tu equipo de TI para deshabilitar temporalmente servicios o software sospechosos y verifica si esto mejora el uso de CPU.

Conclusión

Monitorear y diagnosticar el uso de CPU por parte de SQL Server es una tarea crítica para garantizar el rendimiento óptimo de tu entorno de base de datos. Al utilizar herramientas como el Administrador de Tareas, perfmon y scripts de PowerShell, puedes identificar si SQL Server es el responsable del alto uso de CPU y tomar las medidas necesarias para solucionar el problema. Mantener tu entorno SQL Server bien optimizado no solo mejorará el rendimiento, sino que también garantizará que tus aplicaciones funcionen sin problemas, brindando una mejor experiencia a los usuarios finales.

Qué es un Query Store en SQL Server

Script de Información a Nivel de Base de Datos en SQL Server

Script para saber el histórico de queries ejecutados SQL

SSPI handshake failed with error code 0x8009030c SQL Server

Cuentos de miedo para influencers

Extracción de las Vistas en SQL Server

EXEC sp_change_users_login SQL SERVER

EXEC sp_change_users_login SQL SERVER

Exec sp_change_users_login 'Auto_Fix', '<USUARIO>' en SQL Server se utiliza para resolver problemas de desincronización entre un Login y un User en una base de datos.

Contexto

En SQL Server, un Login es la cuenta a nivel de servidor que se utiliza para autenticarse en SQL Server, mientras que un User es la cuenta a nivel de base de datos asociada con un Login. Cada usuario de una base de datos está vinculado a un Login mediante un SID (Security Identifier). Sin embargo, a veces el vínculo entre un Login y un User se pierde o se desincroniza, lo que puede ocurrir si, por ejemplo, restauras una base de datos en un servidor diferente o después de cambios de configuración.

Lo que hace el comando

  • sp_change_users_login 'Auto_Fix': Este procedimiento almacenado se utiliza para corregir la desincronización entre el Login y el User.
  • 'Contabilidad': Especifica el nombre del usuario a nivel de base de datos que intentas arreglar.

Cuando ejecutas sp_change_users_login 'Auto_Fix', 'Contabilidad', SQL Server hace lo siguiente:

  1. Busca un Login con el mismo nombre que el usuario de la base de datos (‘Contabilidad’ en este caso).
  2. Si encuentra un Login con el mismo nombre:
    • SQL Server asocia automáticamente el User (‘Contabilidad’) con el Login que tiene el mismo nombre.
    • El SID del User se actualiza para coincidir con el SID del Login, reparando la desincronización.
  3. Si no encuentra un Login con el mismo nombre:
    • No se realiza ninguna acción.

Ejemplo de Uso

Este comando es particularmente útil en situaciones como:

  • Restauración de una base de datos en un servidor diferente: Donde los SIDs del User y Login podrían no coincidir.
  • Migración de Logins y Usuarios: Cuando se han creado Logins o Usuarios nuevos que no están vinculados correctamente.

Recomendaciones

  • Verificar Antes de Usar: Antes de usar Auto_Fix, asegúrate de que efectivamente el Login y el User deberían estar vinculados. No es recomendable utilizar este comando sin verificar, ya que puede asociar incorrectamente un User a un Login equivocado si simplemente coinciden en nombre.
  • Alternativas: Si deseas más control, podrías usar sp_change_users_login con la opción 'Update_One' para asociar manualmente un Login específico con un User.

Uso del Comando EXEC sp_change_users_login en SQL Server Después de una Migración

Cuando se realiza una migración de bases de datos en SQL Server, es común encontrarse con un problema relacionado con la desconexión entre los usuarios de la base de datos y los inicios de sesión (logins) en el servidor. Este desajuste ocurre debido a que los inicios de sesión (a nivel del servidor) y los usuarios (a nivel de la base de datos) están vinculados por un identificador de seguridad (SID). Si durante la migración estos SIDs no coinciden, los usuarios pueden experimentar problemas de acceso, incluso si parecen estar correctamente configurados.

Aquí es donde el comando EXEC sp_change_users_login resulta invaluable.

¿Qué es sp_change_users_login?

El procedimiento almacenado sp_change_users_login se utiliza para solucionar los problemas de desconexión entre los usuarios y los inicios de sesión en SQL Server. Su función principal es reparar estas desconexiones asociando de nuevo un usuario de base de datos con su correspondiente inicio de sesión.

Sintaxis Básica

EXEC sp_change_users_login 'Auto_Fix', 'nombre_usuario', NULL, 'nueva_contraseña';

Parámetros:

  • ‘Auto_Fix’: Indica que se debe intentar reparar la relación entre el usuario y el inicio de sesión automáticamente. Si no existe un inicio de sesión correspondiente, lo creará.
  • ‘nombre_usuario’: Especifica el nombre del usuario de la base de datos que se desea asociar con un inicio de sesión.
  • ‘nueva_contraseña’ (opcional): Define una nueva contraseña para el inicio de sesión si se crea uno nuevo.

Ejemplo de Uso Después de una Migración

Supongamos que migraste una base de datos llamada MiBaseDeDatos desde un servidor ServidorA a un nuevo servidor ServidorB. Después de la migración, los usuarios de la base de datos en ServidorB podrían estar desconectados de sus inicios de sesión. Para resolver esto, puedes usar el siguiente comando:

USE MiBaseDeDatos;
GO
EXEC sp_change_users_login 'Auto_Fix', 'usuario1';

Este comando intentará asociar al usuario usuario1 con su correspondiente inicio de sesión en el servidor. Si el inicio de sesión no existe, se puede crear automáticamente y puedes especificar una nueva contraseña, si es necesario.

¿Cuándo Deberías Usar sp_change_users_login?

  • Después de una Migración: Como se mencionó, este es el uso más común. Cuando se migra una base de datos a un nuevo servidor, los usuarios y los inicios de sesión pueden estar desconectados.
  • Restauración de Base de Datos: También es útil después de restaurar una base de datos en un servidor diferente al original.
  • Consolidación de Servidores: Si estás consolidando varias bases de datos en un solo servidor, sp_change_users_login puede ayudar a mantener la coherencia entre usuarios y logins.

Consideraciones Adicionales

Es importante destacar que sp_change_users_login está marcado como obsoleto en versiones futuras de SQL Server. Microsoft recomienda utilizar comandos como ALTER USER junto con la opción WITH LOGIN para manejar este tipo de situaciones en versiones más recientes.

En resumen, este comando es una herramienta útil para resolver problemas de desincronización entre Logins y Users, pero debe usarse con cuidado para evitar errores en la asociación de cuentas.

Cuentos de miedo para Informáticos: Historias de terror para informáticos

Auditoría descubriendo las Conexiones en SQL Server

Bloqueo procedimiento por un Blk By en SQL server

Para que una tabla tenga FULLTEXT SQL

¿Es Necesario Hacer un Refresco de una Vista en SQL Server?

Monitoreo Avanzado de Sesiones en SQL Server

Script de Monitoreo Avanzado de Sesiones en SQL Server

Monitoreo Avanzado de Sesiones en SQL Server, en la administración de bases de datos SQL Server, es crucial monitorear las sesiones activas para identificar problemas de rendimiento, bloquear procesos, y optimizar las operaciones. Una manera efectiva de hacerlo es utilizando consultas avanzadas que nos proporcionen una visión detallada de lo que está sucediendo en el servidor. En este blog, desglosaremos una consulta compleja que te permite obtener información detallada sobre las sesiones activas, el progreso de sus operaciones, y otros indicadores clave.

La Consulta en Detalle

La consulta que vamos a analizar es la siguiente:

SELECT 
ss.session_id SPID,
original_login_name,
sp.status,
blocking_session_id [Blk by],
command,
db_name(sp.database_id) [Database],
[objectid],
percent_complete [% Done],
CASE
WHEN DATEDIFF(mi, start_time, GETDATE()) > 60 THEN
CONVERT(varchar(4), (DATEDIFF(mi, start_time, GETDATE()) / 60)) + ' hr '
ELSE ''
END +
CASE
WHEN DATEDIFF(ss, start_time, GETDATE()) > 60 THEN
CONVERT(varchar(4), (DATEDIFF(mi, start_time, GETDATE()) % 60)) + ' min '
ELSE ''
END +
CONVERT(varchar(4), (DATEDIFF(ss, start_time, GETDATE()) % 60)) + ' sec' [Duration],
estimated_completion_time / 60000 [ETA (Min)],
[text] [input stream/text],
(SUBSTRING([text], statement_start_offset / 2 + 1,
((CASE
WHEN statement_end_offset < 0 THEN (LEN(CONVERT(nvarchar(max), [text])) * 2)
ELSE statement_end_offset
END) - statement_start_offset) / 2 + 1)) AS [Executing_sql_statement],
wait_resource,
wait_time / 1000 [wait_time (sec)],
last_wait_type,
login_time,
last_request_start_time,
last_request_end_time,
host_name,
CASE
WHEN program_name LIKE 'SQLAgent%Job%' THEN
(SELECT TOP 1 '(SQLAgent Job - ' + name + ' - ' + RIGHT(program_name, LEN(program_name) - CHARINDEX(':', program_name))
FROM msdb.dbo.sysjobs SJ
WHERE UPPER(master.dbo.fn_varbintohexstr(SJ.job_id)) = UPPER(SUBSTRING([program_name], 30, 34)))
ELSE program_name
END [program_name],
sp.open_transaction_count,
CASE
WHEN sp.transaction_isolation_level = 0 THEN 'Unspecified'
WHEN sp.transaction_isolation_level = 1 THEN 'ReadUncommitted'
WHEN sp.transaction_isolation_level = 2 THEN 'ReadCommitted'
WHEN sp.transaction_isolation_level = 3 THEN 'Repeatable'
WHEN sp.transaction_isolation_level = 4 THEN 'Serializable'
WHEN sp.transaction_isolation_level = 5 THEN 'Snapshot'
END [transaction_isolation_level],
sp.cpu_time,
sp.reads,
sp.writes,
sp.logical_reads,
sp.lock_timeout,
sp.row_count
FROM sys.dm_exec_requests AS sp
OUTER APPLY sys.dm_exec_sql_text(sp.sql_handle) AS esql
RIGHT OUTER JOIN sys.dm_exec_sessions ss ON ss.session_id = sp.session_id
WHERE ss.status <> 'sleeping';


¿Qué hace esta consulta sobre Monitoreo Avanzado de Sesiones en SQL Server?

Esta consulta está diseñada para obtener información detallada sobre las sesiones activas en SQL Server, excluyendo aquellas en estado sleeping. Vamos a desglosar los principales elementos de la consulta para entender cómo funciona y qué información proporciona.

1. Información Básica de la Sesión

  • SPID (session_id): Identificador único de la sesión en el servidor.
  • original_login_name: El nombre de usuario que inició la sesión.
  • status: El estado actual de la sesión, por ejemplo, running, suspended, etc.
  • Blk by (blocking_session_id): Indica el SPID del proceso que está bloqueando esta sesión, si existe un bloqueo.

2. Detalles del Comando y Progreso

  • command: El comando SQL que se está ejecutando en la sesión.
  • Database: La base de datos donde se está ejecutando el comando.
  • percent_complete: Porcentaje de progreso de la operación en ejecución, útil para operaciones de larga duración como indexaciones o backups.
  • Duration: Muestra cuánto tiempo ha estado en ejecución la operación actual.

3. Estimaciones y Texto de la Consulta

  • ETA (Min): Estimación del tiempo restante para completar la operación en minutos.
  • input stream/text: El texto completo del comando SQL que se está ejecutando.
  • Executing_sql_statement: El texto exacto de la declaración SQL que se está ejecutando en ese momento.

4. Información de Espera y Bloqueos

  • wait_resource: El recurso específico en el que la sesión está esperando.
  • wait_time (sec): Tiempo que la sesión ha estado esperando en segundos.
  • last_wait_type: El tipo de espera más reciente para esta sesión, que puede ayudar a diagnosticar problemas de rendimiento.

5. Detalles del Sistema y Programa

  • host_name: Nombre del host desde el cual se ha iniciado la sesión.
  • program_name: Nombre del programa que inició la sesión. Si es un trabajo de SQL Agent, también se muestra el nombre del trabajo.

6. Transacciones y Aislamiento

  • open_transaction_count: Número de transacciones abiertas en la sesión.
  • transaction_isolation_level: El nivel de aislamiento de transacción actual, que puede variar desde ReadUncommitted hasta Serializable.

7. Estadísticas de Uso de Recursos

  • cpu_time, reads, writes, logical_reads: Estadísticas sobre el uso de CPU, operaciones de lectura y escritura, y lecturas lógicas realizadas por la sesión.
  • lock_timeout: El número de veces que una operación ha excedido el tiempo de espera para obtener un bloqueo.
  • row_count: El número de filas procesadas por la sesión.

Aplicaciones Prácticas

Monitoreo de Sesiones Activas

Esta consulta es invaluable para administradores de bases de datos que necesitan una visión detallada de las sesiones activas en su servidor. Permite identificar rápidamente sesiones problemáticas, como aquellas que están bloqueando otras, o que están consumiendo una cantidad excesiva de recursos.

Diagnóstico de Problemas de Rendimiento

Al revisar los tiempos de espera, los tipos de bloqueo, y las estadísticas de uso de recursos, puedes diagnosticar cuellos de botella en el rendimiento y tomar medidas para optimizar las operaciones. Por ejemplo, si un proceso está tomando demasiado tiempo debido a una espera en un recurso, puedes investigar más a fondo o ajustar la configuración de SQL Server para mejorar la eficiencia.

Gestión de Transacciones

Con el conteo de transacciones abiertas y el nivel de aislamiento de transacciones, esta consulta también ayuda a garantizar que las transacciones se manejen de manera eficiente y que no existan conflictos que puedan causar bloqueos o ralentizaciones.

¿Cuándo usar este script: Monitoreo Avanzado de Sesiones en SQL Server?

Esta consulta es una herramienta poderosa para monitorear y diagnosticar sesiones activas en SQL Server. Aquí te explico algunas situaciones específicas en las que puede ser especialmente útil:

1. Identificación de Procesos Lentos o Colgados

Si experimentas que ciertas operaciones en SQL Server están tomando mucho más tiempo de lo habitual, puedes ejecutar esta consulta para identificar el proceso problemático. Al revisar columnas como Duration, percent_complete, y ETA (Min), puedes determinar cuánto tiempo ha estado ejecutándose la operación y si está cerca de completarse.

Situación: Supongamos que un trabajo de mantenimiento, como la reconstrucción de un índice, está tomando demasiado tiempo. Esta consulta te permite ver el porcentaje completado (percent_complete), el tiempo estimado de finalización (ETA (Min)), y el tiempo total que ha estado en ejecución (Duration). Si los tiempos son excesivos, puedes tomar decisiones como cancelar el trabajo o investigar más a fondo qué lo está ralentizando.

2. Diagnóstico de Bloqueos

Los bloqueos son un problema común en bases de datos concurridas, donde un proceso retiene un bloqueo sobre un recurso y otros procesos deben esperar. Esta consulta te ayuda a identificar procesos que están siendo bloqueados y el proceso que los está bloqueando (Blk by).

Situación: Si los usuarios informan que una aplicación se está quedando colgada o que las transacciones están tardando más de lo normal, puedes ejecutar esta consulta para ver si hay bloqueos. La columna Blk by te muestra el SPID del proceso que está causando el bloqueo, permitiéndote investigar más a fondo o tomar acciones, como matar el proceso bloqueador.

3. Optimización de Consultas

La consulta muestra el texto completo del SQL que se está ejecutando (input stream/text) y la parte específica de la declaración que se está ejecutando actualmente (Executing_sql_statement). Esto es extremadamente útil para optimizar consultas, ya que te permite identificar qué parte exacta de una consulta compleja está consumiendo más recursos o está tomando más tiempo.

Situación: Si una consulta está utilizando demasiado CPU o está provocando muchas lecturas/escrituras, puedes usar esta información para revisar y optimizar la consulta SQL en cuestión. Podrías agregar índices, reescribir la consulta, o ajustar los planes de ejecución para mejorar el rendimiento.

4. Monitoreo de Trabajos Programados

SQL Server Agent es responsable de ejecutar trabajos programados, como copias de seguridad o tareas de mantenimiento. A veces, estos trabajos pueden fallar o tomar más tiempo del esperado. La columna program_name en esta consulta identifica específicamente si una sesión está ejecutando un trabajo de SQL Agent, incluyendo el nombre del trabajo.

Situación: Si sospechas que un trabajo de SQL Agent no se está ejecutando correctamente, esta consulta te permitirá identificarlo y ver en qué etapa está. Esto es útil para resolver problemas rápidamente sin tener que buscar manualmente en los registros de SQL Agent.

5. Análisis de Esperas y Bloqueos

Las columnas wait_time (sec) y last_wait_type te permiten ver cuánto tiempo ha estado esperando un proceso y cuál fue el último tipo de espera experimentado. Esto es crucial para diagnosticar problemas de rendimiento relacionados con la espera de recursos como discos, CPU, o bloqueos de otros procesos.

Situación: Si notas que ciertas transacciones están tardando más de lo normal, puedes usar estas columnas para ver si están esperando en recursos específicos, como una página de datos bloqueada por otro proceso o esperando en disco debido a una operación de entrada/salida lenta.

6. Gestión de Transacciones

Las columnas open_transaction_count y transaction_isolation_level son útiles para entender cómo las transacciones están siendo manejadas en el servidor. Esto puede ayudarte a diagnosticar problemas de concurrencia o ver si una transacción está manteniendo recursos bloqueados durante mucho tiempo.

Situación: Si un proceso tiene una transacción abierta durante un período prolongado, podría estar reteniendo bloqueos que afectan a otros procesos. Identificar el nivel de aislamiento de la transacción también te permite ajustar configuraciones o recomendaciones para evitar problemas de concurrencia.

7. Control del Uso de Recursos

Las columnas que muestran cpu_time, reads, writes, y logical_reads te permiten evaluar el uso de recursos de una sesión específica. Esta información es crucial para identificar procesos que están consumiendo más recursos de los necesarios.

Situación: Si el rendimiento del servidor está degradado, puedes usar esta consulta para identificar qué procesos están utilizando mucho CPU o realizando muchas operaciones de lectura/escritura. Esto te ayuda a tomar decisiones sobre si es necesario optimizar la consulta, moverla a un horario de menor carga, o revisar el plan de ejecución.

Conclusión

Esta consulta avanzada es una herramienta poderosa para el monitoreo y diagnóstico de sesiones activas en SQL Server. Proporciona una visión profunda del comportamiento de las sesiones y permite a los administradores identificar problemas de rendimiento, gestionar transacciones, y asegurar que el servidor funcione de manera óptima. Si estás buscando una manera de mejorar el rendimiento y la estabilidad de tu servidor SQL, incorporar esta consulta en tus rutinas de monitoreo es un excelente primer paso.

UPDATE JOIN en SQL para Actualizar Tablas Relacionadas

dm_exec_procedure_stats en SQL Server

Información del Servidor SQL Server con T-SQL

Script para saber el histórico de queries ejecutados SQL

Guía Completa para Implementar FULLTEXT en SQL

Cuentos de miedo para Informáticos: Historias de terror para informáticos

Análisis de una Sentencia de Bloqueo en SQL Server

Análisis de una Sentencia de Bloqueo en SQL Server

Sentencia de Bloqueo en SQL Server, en SQL Server, los bloqueos son una parte fundamental del mecanismo de control de concurrencia, garantizando la integridad de los datos cuando múltiples transacciones acceden simultáneamente a los mismos recursos. En este blog, vamos a desglosar y analizar un ejemplo concreto de una sentencia de bloqueo que puedes encontrar en un entorno de SQL Server.

Entendiendo la Sentencia de Bloqueo

Aquí tienes la sentencia de bloqueo que vamos a analizar:

pagelock fileid=3 pageid=174947664 dbid=7 subresource=FULL id=lock35f1dbd5000 mode=X associatedObjectId=72057674882351104

Esta sentencia es un ejemplo de la información que SQL Server proporciona cuando un bloqueo ocurre en una página específica de la base de datos. Vamos a desglosar cada componente para entender su significado.

1. pagelock

Este término indica que el tipo de bloqueo se está aplicando a una página dentro de un archivo de datos de la base de datos. En SQL Server, los datos se almacenan en páginas de 8 KB. Un pagelock significa que SQL Server está bloqueando una página específica para evitar accesos simultáneos no controlados.

2. fileid=3

El fileid identifica el archivo dentro de la base de datos en el que se encuentra la página bloqueada. En SQL Server, una base de datos puede estar compuesta por múltiples archivos de datos, y cada uno de ellos tiene un identificador único. Aquí, fileid=3 indica que el bloqueo está ocurriendo en el archivo con ID 3.

3. pageid=174947664

El pageid indica el identificador de la página dentro del archivo especificado que está siendo bloqueada. En este caso, pageid=174947664 nos dice cuál es la página específica que está bajo el bloqueo dentro del archivo con fileid=3.

4. dbid=7

El dbid es el identificador de la base de datos en la que está ocurriendo el bloqueo. Cada base de datos en SQL Server tiene un ID único. Aquí, dbid=7 indica la base de datos donde se encuentra el archivo y la página bloqueada.

5. subresource=FULL

subresource=FULL indica que el bloqueo afecta a toda la página, no solo a una porción específica de la misma. Esto significa que ningún otro proceso puede acceder o modificar cualquier parte de esta página hasta que se libere el bloqueo.

6. id=lock35f1dbd5000

El id es un identificador único para el bloqueo en cuestión. Este ID es utilizado internamente por SQL Server para gestionar y rastrear los bloqueos.

7. mode=X

El mode (modo) indica el tipo de bloqueo que se ha aplicado. En este caso, mode=X indica un bloqueo exclusivo (Exclusive Lock). Un bloqueo exclusivo impide que otros procesos lean o modifiquen la página hasta que se complete la transacción que lo generó.

8. associatedObjectId=72057674882351104

El associatedObjectId indica el ID del objeto asociado con el bloqueo. Este ID se puede utilizar para identificar la tabla o índice específico que contiene la página bloqueada. En este caso, associatedObjectId=72057674882351104 es el identificador del objeto dentro de la base de datos.

Análisis del Bloqueo

El bloqueo descrito en la sentencia anterior es un bloqueo exclusivo en una página específica dentro de un archivo de datos. Esto significa que una transacción está realizando una operación que modifica los datos en esa página, y SQL Server ha colocado un bloqueo para garantizar que ningún otro proceso interfiera con esta operación.

¿Por qué es importante entender estos detalles?

  • Identificación de problemas de rendimiento: Si observas que un proceso está reteniendo un bloqueo exclusivo durante un período prolongado, podría estar causando bloqueos a otros procesos, lo que se traduce en problemas de rendimiento. Identificar el archivo, página y objeto involucrados puede ayudarte a resolver estos problemas.
  • Resolución de bloqueos: Conociendo el mode=X, sabes que ningún otro proceso puede acceder a esa página. Esto puede ser crucial si estás diagnosticando un problema de bloqueo donde otros procesos están esperando a que este se libere.
  • Optimización de consultas: Si constantemente ves bloqueos en las mismas páginas, podría ser un indicio de que las consultas que acceden a esos datos necesitan ser optimizadas, o que es necesario modificar la estructura de la base de datos para reducir la contención.

Conclusión

Entender los detalles de una sentencia de bloqueo en SQL Server, como la que hemos analizado, es crucial para un administrador de bases de datos. Proporciona una visión clara de cómo SQL Server maneja la concurrencia y te permite identificar, diagnosticar y resolver problemas de rendimiento relacionados con bloqueos. Al comprender estos componentes, puedes tomar decisiones informadas para optimizar el rendimiento de tus bases de datos y mejorar la eficiencia de tus aplicaciones.

Procedimientos Almacenados Temporales en SQL Server

Obtener el Uso de Espacio de Todas las Tablas en SQL Server con un Solo Comando

¿Qué es el Transaction Log? La Importancia en SQL Server

dm_exec_requests en SQL Server

¿Qué son las vistas SQL Server? Una Guía Completa

Extracción de las Vistas en SQL Server

Explorando sp_who2 en SQL Server

Explorando sp_who2 en SQL Server: Monitoreo y Diagnóstico Eficiente

Sp_who2 en SQL Server, cuando trabajas con bases de datos SQL Server, es fundamental tener herramientas que te permitan diagnosticar y monitorear el estado de tus procesos. Una de esas herramientas es el procedimiento almacenado sp_who2. Este comando es esencial para identificar qué está sucediendo en tu servidor, permitiéndote tomar decisiones informadas sobre la administración de tu base de datos.

¿Qué es sp_who2?

El comando sp_who2 es una versión mejorada del comando sp_who, ambos proporcionan información sobre los procesos actuales en SQL Server. Sin embargo, sp_who2 ofrece información más detallada y es más comúnmente utilizado debido a sus capacidades extendidas.

¿Cómo ejecutar sp_who2?

Para ejecutar sp_who2, solo necesitas conectarte a tu instancia de SQL Server y ejecutar el siguiente comando:

EXEC sp_who2;

Este comando devolverá una lista de procesos que están actualmente activos en el servidor.

Entendiendo la salida de sp_who2

Al ejecutar sp_who2, verás una tabla con varias columnas. A continuación, te explico las más relevantes:

  1. SPID: (ID de Sesión del Proceso, por sus siglas en inglés). Este número identifica de manera única cada proceso en ejecución.
  2. Status: Indica el estado actual del proceso. Algunos valores comunes incluyen:
    • RUNNABLE: El proceso está listo para ejecutar y solo espera su turno.
    • SLEEPING: El proceso está en espera, sin realizar ninguna acción activa.
    • SUSPENDED: El proceso está bloqueado, esperando a que se resuelva un recurso.
  3. Login: Muestra el usuario que inició sesión y está ejecutando el proceso.
  4. HostName: El nombre del equipo desde donde se originó el proceso.
  5. DBName: La base de datos en la que se está ejecutando el proceso.
  6. Command: El comando que está ejecutando el proceso.
  7. CPUTime y DiskIO: Indican el tiempo de CPU utilizado y las operaciones de entrada/salida en disco realizadas por el proceso, respectivamente. Estos valores ayudan a identificar procesos que consumen muchos recursos.
  8. LastBatch: Muestra cuándo se ejecutó el último lote de instrucciones en esa sesión.
  9. ProgramName: Indica el nombre de la aplicación que inició el proceso.
  10. BlkBy: (Bloqueado por). Si un proceso está siendo bloqueado, esta columna mostrará el SPID del proceso que lo bloquea.

Ejemplos prácticos

1. Identificación de procesos que bloquean otros procesos

Supongamos que tu aplicación está experimentando problemas de rendimiento. Ejecutas sp_who2 y observas que varios procesos tienen el estado SUSPENDED y en la columna BlkBy se muestra un valor distinto a cero. Esto indica que esos procesos están siendo bloqueados. Puedes identificar al proceso que causa el bloqueo buscando su SPID en la columna correspondiente.

códigoEXEC sp_who2;

2. Localización de procesos que consumen mucho CPU

Si notas que tu servidor está lento, puedes utilizar sp_who2 para identificar procesos que consumen una cantidad excesiva de CPU. Observa la columna CPUTime y busca los valores más altos.

EXEC sp_who2;

3. Monitoreo de procesos específicos

Puedes filtrar la salida de sp_who2 para centrarte en procesos específicos. Por ejemplo, si solo te interesa ver los procesos relacionados con un usuario específico:

EXEC sp_who2 'usuario_especifico';

4. Identificación de sesiones inactivas

A veces, las conexiones a la base de datos permanecen abiertas sin realizar ninguna operación. Puedes identificarlas observando la columna Status para ver los procesos en estado SLEEPING y revisando la columna LastBatch para verificar cuándo fue la última vez que ejecutaron un lote de instrucciones.

Conclusión

El comando sp_who2 es una herramienta poderosa en SQL Server para monitorear y diagnosticar problemas de rendimiento. Te permite obtener una visión rápida del estado de los procesos, identificar bloqueos, y localizar sesiones que consumen muchos recursos. Con este conocimiento, puedes optimizar el rendimiento de tu servidor y garantizar un funcionamiento más eficiente de tus aplicaciones.

Archivos MDF y NDF en SQL Server: Guía Completa

Dependencia de Usuarios en SQL: Guía Completa

Descarga de SQL Server Management Studio (SSMS)

Comando Read Linux: Cómo Hacer Peticiones al Usuario en Scripting

Dependencia de Usuarios en SQL: Guía Completa

Bloqueo procedimiento por un Blk By en SQL server

Bloqueo procedimiento por un Blk By en SQL server

Bloqueo procedimiento por un Blk By en SQL Server. En SQL Server, la gestión de bloqueos es una tarea crucial para garantizar el rendimiento y la disponibilidad de las bases de datos. Los bloqueos ocurren cuando un proceso en SQL Server impide que otro proceso acceda a los recursos que necesita, lo que puede llevar a cuellos de botella y problemas de rendimiento. Una herramienta clave para identificar y resolver estos problemas es la columna «Blk By» (Blocked By), que indica qué sesión está bloqueando a otra. En este blog, exploraremos qué es el bloqueo en SQL Server, cómo utilizar «Blk By» para identificar bloqueos y algunos ejemplos prácticos para gestionar y solucionar estos problemas.

¿Qué es un bloqueo en SQL Server?

Un bloqueo en SQL Server ocurre cuando un proceso (una sesión o transacción) mantiene un recurso, como una tabla o una fila, y otro proceso intenta acceder a ese mismo recurso. SQL Server utiliza bloqueos para garantizar la integridad de los datos, pero cuando los bloqueos no se gestionan correctamente, pueden causar que otros procesos se queden esperando indefinidamente, lo que se conoce como bloqueo.

¿Qué es «Blk By» y cómo funciona?

La columna «Blk By» (Blocked By) es una propiedad en la vista del sistema sys.dm_exec_requests que indica el ID de la sesión que está bloqueando a otra sesión. Esta información es crucial para identificar qué transacciones están bloqueando otras operaciones y es el primer paso para resolver problemas de rendimiento relacionados con bloqueos.

Puedes obtener una lista de sesiones bloqueadas y las sesiones que las están bloqueando usando la siguiente consulta T-SQL:

sql: SELECT
    session_id AS [SPID],
    blocking_session_id AS [Blk By],
    wait_type,
    wait_time,
    wait_resource,
    transaction_id,
    TEXT AS [SQL Text]
FROM
    sys.dm_exec_requests
CROSS APPLY
    sys.dm_exec_sql_text(sql_handle)
WHERE blocking_session_id <> 0;

Este script te proporciona una lista de sesiones que están actualmente bloqueadas, mostrando el ID de la sesión bloqueada, el ID de la sesión que la está bloqueando, el tipo de espera, el tiempo de espera y el recurso específico que está causando el bloqueo.

Ejemplo Práctico: Identificación y Resolución de un Bloqueo

Imagina que tienes dos transacciones ejecutándose en tu base de datos:

  1. Transacción A: Actualiza una fila en la tabla Orders.
  2. Transacción B: Intenta leer la misma fila en la tabla Orders antes de que la Transacción A haya finalizado.

Aquí es donde podría ocurrir un bloqueo:

  • La Transacción A adquiere un bloqueo exclusivo en la fila para actualizarla.
  • La Transacción B intenta leer esa misma fila, pero se encuentra bloqueada porque la Transacción A aún no ha terminado.

Si ejecutas el script mencionado anteriormente durante este bloqueo, verás algo como esto:

SPIDBlk Bywait_typewait_timewait_resourcetransaction_idSQL Text
5352LCK_M_S2000PAGE: 7:1:123123456SELECT * FROM Orders WHERE …

En este caso:

  • SPID 53 está bloqueado por SPID 52.
  • El wait_type indica que SPID 53 está esperando un bloqueo compartido (LCK_M_S).
  • La columna wait_time muestra cuánto tiempo ha estado esperando la transacción bloqueada.

Resolución de Bloqueos

Una vez identificado el bloqueo utilizando «Blk By», hay varias formas de resolverlo:

  1. Revisión del código: Analiza las consultas que están causando los bloqueos. En muchos casos, es posible optimizar las consultas o la lógica de las transacciones para reducir la posibilidad de bloqueos.
  2. Terminación de la sesión bloqueadora: Si el bloqueo está afectando gravemente al rendimiento y no puede resolverse rápidamente, puedes optar por finalizar la sesión que está causando el bloqueo. Esto se hace con el comando KILL:

KILL 52;  — Termina la sesión bloqueadora SPID 52

  1. Advertencia: Finalizar una sesión puede causar la pérdida de datos si la transacción no se ha completado.
  2. Implementar niveles de aislamiento de transacciones: Puedes ajustar los niveles de aislamiento de las transacciones para reducir la probabilidad de bloqueos. Por ejemplo, puedes utilizar Read Committed Snapshot Isolation (RCSI) para permitir que las transacciones lean datos sin esperar a que se liberen los bloqueos.

Consejos para Evitar Bloqueos en el Futuro

  • Mantén las transacciones cortas: Cuanto más tiempo duren las transacciones, mayor es la posibilidad de que causen bloqueos. Asegúrate de que las transacciones se completen lo más rápido posible.
  • Orden de acceso a los recursos: Diseña tus aplicaciones para que accedan a los recursos en un orden coherente. Esto ayuda a evitar situaciones en las que dos transacciones se bloquean mutuamente.
  • Monitoreo continuo: Usa herramientas de monitoreo de SQL Server para detectar bloqueos en tiempo real y actuar antes de que se conviertan en un problema mayor.

Porque puede bloquear una de sus propias operaciones SQL Server

Un proceso en SQL Server puede bloquear una de sus propias operaciones en situaciones donde hay competencia por los mismos recursos que el proceso necesita para continuar. Esto generalmente ocurre debido a la forma en que SQL Server maneja los bloqueos y las transacciones. Aquí te explico algunas de las razones más comunes por las cuales un proceso puede bloquearse a sí mismo:


1. Contención de Recursos dentro de una Transacción

  • Cuando un proceso ejecuta múltiples operaciones que necesitan acceder al mismo recurso dentro de una transacción, SQL Server puede bloquearse si la primera operación aún no ha completado su trabajo en ese recurso.
  • Ejemplo: Si un índice se está reconstruyendo y la operación intenta acceder a las mismas páginas de datos o índices que ya están bloqueados por otra parte de la misma transacción, esto puede causar un bloqueo interno.

2. Escalado de Bloqueos

  • SQL Server puede escalar un bloqueo de nivel de fila o página a un bloqueo de nivel de tabla si se están tocando muchos recursos. Si una parte del proceso ya tiene un bloqueo en una fila o página y otra parte del mismo proceso intenta escalar ese bloqueo, podría bloquearse a sí mismo.
  • Ejemplo: Durante una operación de índice o actualización masiva, SQL Server intenta bloquear la tabla completa después de haber adquirido muchos bloqueos de página, lo que causa que la operación espere a sí misma.

3. Operaciones Concurrentes en Paralelo

  • En algunos casos, SQL Server puede ejecutar partes de un mismo proceso en paralelo (especialmente si la opción MAXDOP está habilitada). Si una de estas operaciones paralelas necesita un recurso que otra parte del proceso ya ha bloqueado, puede haber un bloqueo interno.
  • Ejemplo: Diferentes threads del mismo proceso paralelo intentan acceder a la misma página de índice al mismo tiempo.

4. Espacio en TempDB

  • Si el proceso está usando tempdb intensivamente, como cuando se reconstruyen índices con la opción SORT_IN_TEMPDB, y tempdb no tiene suficiente espacio, esto puede hacer que las diferentes partes del proceso se bloqueen mientras esperan recursos en tempdb.

5. Actualizaciones o Modificaciones Complejas

  • Si un proceso realiza operaciones complejas de actualización que requieren múltiples pasos en una sola transacción, SQL Server podría establecer bloqueos en diferentes niveles de la jerarquía (fila, página, tabla) y acabar bloqueando el proceso.
  • Ejemplo: Una actualización que involucra una combinación de varias filas y luego un intento de acceso a esas mismas filas en la misma transacción.

6. Deadlocks Internos

  • Aunque menos común, un proceso puede experimentar un deadlock interno, donde diferentes partes de una misma operación se bloquean mutuamente.

Diagnóstico y Resolución bloqueo procedimiento por un Blk By en SQL Server

  • Monitoreo de Esperas (sys.dm_exec_requests):
  • Usa la consulta que te proporcioné antes para identificar el tipo de espera (wait_type) y el recurso (wait_resource) que está causando el bloqueo.
  • Revisión del Plan de Ejecución:
  • Si el proceso involucra una consulta compleja, revisa el plan de ejecución para ver si hay operaciones que están escalando los bloqueos o creando contenciones inesperadas.
  • Revisar las Transacciones:
  • Si el proceso está ejecutando múltiples pasos dentro de una transacción, considera si es posible dividir las operaciones o mejorar el manejo de los bloqueos para evitar la contención.
  • Optimización de Índices y Consultas:
  • Asegúrate de que las consultas y las operaciones de índice están optimizadas para evitar acceder repetidamente a los mismos recursos en paralelo.
  • Uso de Hints de Bloqueo:
  • Si es apropiado, considera el uso de hints de bloqueo para controlar mejor cómo SQL Server maneja los bloqueos durante la operación.

Conclusión

Gestionar los bloqueos en SQL Server es fundamental para mantener el rendimiento y la disponibilidad de las bases de datos. La columna «Blk By» es una herramienta esencial para identificar rápidamente las sesiones que están causando bloqueos y tomar medidas correctivas. Implementar buenas prácticas y utilizar herramientas de monitoreo proactivas te ayudará a minimizar la incidencia de bloqueos y mantener tus bases de datos funcionando de manera eficiente.

Cómo Obtener el tamaño de los archivos de Datos en SQL Server

dm_exec_procedure_stats en SQL Server

dm_exec_procedure_stats en SQL Server

Script Creación de Roles en SQL Server

¿Qué es el Transaction Log? La Importancia en SQL Server

Procedimientos Almacenados Temporales en SQL Server

Identificar Objetos No Utilizados en su Base de Datos SQL Server

EXEC master.dbo.sp_MSforeachdb

Filegroups en SQL Server: Más Allá del Grupo de Archivos Primario

Filegroups en SQL Server, en el mundo de las bases de datos SQL Server, los filegroups son componentes fundamentales que permiten una organización eficiente de los datos. Aunque muchas personas están familiarizadas con el grupo de archivos primario, es posible que no sepan que una base de datos puede contener otros filegroups. En este artículo, exploraremos qué son los filegroups, por qué son importantes, cómo se gestionan y cómo puedes obtener información sobre ellos utilizando T-SQL.

¿Qué son los Filegroups en SQL Server?

Los filegroups en SQL Server son una forma de agrupar archivos de datos para mejorar la organización y el rendimiento de la base de datos. Cada base de datos tiene al menos un filegroup primario, pero puedes crear filegroups adicionales para distribuir los datos entre varios discos duros, lo que puede mejorar la velocidad de acceso y la gestión de grandes volúmenes de datos.

Tipos de Filegroups

  1. Grupo de Archivos Primario: Es el filegroup predeterminado que contiene los metadatos de la base de datos y, por defecto, todos los objetos de la base de datos.
  2. Filegroups Secundarios: Son filegroups adicionales que puedes crear para almacenar datos de usuario. Estos filegroups pueden ser utilizados para mejorar el rendimiento y la administración.

Ventajas de Usar Filegroups

  1. Mejora del Rendimiento: Al distribuir los datos en múltiples discos, puedes reducir la carga en un solo disco y mejorar el rendimiento general de la base de datos. Esto es especialmente útil en sistemas con alta concurrencia de acceso a datos.
  2. Facilidad de Administración: Los filegroups permiten una administración más sencilla de los archivos de datos, facilitando tareas como el backup y la restauración. Puedes realizar copias de seguridad de filegroups específicos, lo que reduce el tiempo de inactividad.
  3. Escalabilidad: Puedes añadir filegroups adicionales a medida que crece la base de datos, lo que permite una escalabilidad más fácil. Esto es crucial para aplicaciones que manejan grandes volúmenes de datos.
  4. Optimización de Consultas: Al colocar tablas y sus índices en filegroups separados, puedes optimizar el rendimiento de las consultas, ya que SQL Server puede acceder a los datos de manera más eficiente.

Cómo Crear y Administrar Filegroups

Creación de Filegroups

Para crear un nuevo filegroup en SQL Server, puedes utilizar el siguiente comando T-SQL:

ALTER DATABASE MiBaseDeDatos
ADD FILEGROUP MiNuevoFilegroup;

Añadir Archivos a un Filegroup

Una vez que has creado un filegroup, necesitas añadir archivos de datos a él. Aquí tienes un ejemplo de cómo hacerlo:

ALTER DATABASE MiBaseDeDatos
ADD FILE
(
NAME = MiArchivoDeDatos,
FILENAME = 'C:\Data\MiArchivoDeDatos.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MiNuevoFilegroup;

Asignación de Objetos a Filegroups

Puedes especificar en qué filegroup se deben almacenar las tablas o índices al momento de su creación:

sqlCREATE TABLE MiTabla
(
    ID INT PRIMARY KEY,
    Nombre NVARCHAR(100)
) ON MiNuevoFilegroup;

Cómo Obtener Información de los Filegroups Usando T-SQL

Para obtener información sobre los filegroups en cada base de datos de un servidor SQL, puedes utilizar el siguiente comando T-SQL. Este comando ejecuta una consulta en cada base de datos para mostrar los resultados relacionados con los filegroups.

EXEC master.dbo.sp_MSforeachdb @command1 = 'USE [?] SELECT * FROM sys.filegroups'

Explicación del Código

  • EXEC master.dbo.sp_MSforeachdb: Esta es una función no documentada que permite ejecutar un comando en cada base de datos del servidor. Aunque es muy útil, se debe usar con precaución debido a su naturaleza no documentada.
  • @command1 = ‘USE [?] SELECT * FROM sys.filegroups’: Este comando cambia el contexto a cada base de datos y selecciona todos los registros de la vista sys.filegroups, que contiene información sobre los filegroups de la base de datos actual.

Ejemplo de Resultados

Al ejecutar el comando anterior, obtendrás una lista de filegroups para cada base de datos en el servidor, similar a la siguiente:

namedata_space_idtypetype_descis_default
PRIMARY10ROWS_FILEGROUP1
FileGroup120ROWS_FILEGROUP0
FileGroup230ROWS_FILEGROUP0

Mejores Prácticas para el Uso de Filegroups

  1. Planificación de la Distribución de Datos: Antes de crear filegroups, planifica cómo distribuirás los datos. Considera factores como el tamaño de los datos, la frecuencia de acceso y las necesidades de rendimiento.
  2. Monitoreo Regular: Utiliza herramientas de monitoreo para evaluar el rendimiento de los filegroups y ajustar la distribución de los datos según sea necesario.
  3. Uso de Filegroups para Particionamiento: Si trabajas con grandes volúmenes de datos, considera el uso de filegroups para implementar particionamiento de tablas, lo que puede mejorar significativamente el rendimiento de las consultas.
  4. Copia de Seguridad y Restauración: Aprovecha la capacidad de realizar copias de seguridad de filegroups individuales para minimizar el tiempo de inactividad durante las operaciones de mantenimiento.
  5. Evitar el Uso Excesivo de Filegroups: Aunque los filegroups son útiles, no crees demasiados sin una razón clara, ya que esto puede complicar la administración de la base de datos.

Conclusión

Entender y utilizar filegroups adicionales en SQL Server ofrece una serie de beneficios, desde mejorar el rendimiento hasta facilitar la administración de la base de datos. Utilizar comandos T-SQL como el que hemos discutido te permite obtener rápidamente información sobre la estructura de filegroups en tus bases de datos, ayudándote a tomar decisiones informadas sobre la organización y optimización de tus datos.

SQL: ¿Configurar los Archivos LDF y MDF en Unidades Distintas es Importante?

Archivos MDF y NDF en SQL Server: Guía Completa

Script para saber el histórico de queries ejecutados SQL

Conociendo las Trazas Habilitadas en SQL Server: Guía DBAs

Entendiendo Kerberos en SQL Server: Seguridad y Autenticación

Obtener el Uso de Espacio de Todas las Tablas en SQL Server con un Solo Comando

Obtener el Uso de Espacio de Todas las Tablas en SQL Server con un Solo Comando

Espacio de Todas las Tablas en SQL Server, en la administración de bases de datos SQL Server, una de las tareas más importantes es monitorear el uso del espacio en las tablas. Saber cuánto espacio está ocupando cada tabla te ayuda a optimizar el rendimiento y a gestionar el almacenamiento de manera eficiente. Afortunadamente, SQL Server ofrece una forma rápida y sencilla de obtener esta información para todas las tablas de una base de datos con un solo comando. En este blog, te explicaré cómo hacerlo utilizando el procedimiento almacenado sp_spaceused en combinación con sp_msforeachtable.

¿Qué hace el comando EXEC sp_msforeachtable 'EXEC sp_spaceused [?]'?

Este comando es un truco útil en SQL Server que te permite ejecutar el procedimiento almacenado sp_spaceused en todas las tablas de la base de datos actual. El procedimiento sp_spaceused proporciona información sobre el uso de espacio de una tabla específica, incluyendo el tamaño de los datos, el tamaño de los índices y el espacio no utilizado. Al combinarlo con sp_msforeachtable, puedes obtener esta información para todas las tablas en una sola ejecución.

Obtener el Uso de Espacio de Todas las Tablas en SQL Server con un Solo Comando

¿Cómo funciona?

El comando sp_msforeachtable es un procedimiento no documentado en SQL Server que itera sobre cada tabla en la base de datos y ejecuta un comando específico en cada una de ellas. En este caso, se utiliza para ejecutar sp_spaceused en cada tabla. El carácter ? dentro del comando se reemplaza automáticamente con el nombre de cada tabla durante la iteración.

Aquí está el comando completo:

sql: EXEC sp_msforeachtable 'EXEC sp_spaceused [?]';

¿Qué información proporciona este comando?

Cuando ejecutas este comando, SQL Server devuelve una serie de resultados, uno por cada tabla en la base de datos. Cada resultado incluye:

  • Nombre de la tabla: El nombre de la tabla para la cual se está mostrando la información.
  • Número de filas: El número de filas almacenadas en la tabla.
  • Espacio reservado: La cantidad total de espacio reservado para la tabla.
  • Espacio de datos: El espacio ocupado por los datos almacenados en la tabla.
  • Espacio de índices: El espacio utilizado por los índices asociados a la tabla.
  • Espacio no utilizado: La cantidad de espacio reservado que no está siendo utilizado actualmente.

Aplicaciones prácticas del comando sp_msforeachtable y sp_spaceused

Este comando es extremadamente útil en varias situaciones, especialmente cuando necesitas revisar el uso de espacio en una base de datos con muchas tablas:

  • Optimización del rendimiento: Al revisar regularmente el uso de espacio, puedes identificar tablas que están ocupando más espacio del esperado y tomar medidas para optimizar su rendimiento, como la reorganización de índices o la limpieza de datos no utilizados.
  • Gestión de almacenamiento: Conocer el uso de espacio de cada tabla te permite gestionar el almacenamiento de manera más eficiente, asegurándote de que no estás acercándote a los límites de capacidad del disco.
  • Auditorías y reportes: Este comando es útil para generar reportes rápidos sobre el estado de las tablas en términos de espacio utilizado, lo cual puede ser requerido en auditorías o para fines de planificación.

Conclusión

El uso del comando EXEC sp_msforeachtable 'EXEC sp_spaceused [?]' es un truco poderoso para cualquier DBA que necesite monitorear y gestionar el uso de espacio en SQL Server. Con un solo comando, puedes obtener una visión completa del espacio utilizado por cada tabla en tu base de datos, lo que te permite tomar decisiones informadas para optimizar el rendimiento y la eficiencia del almacenamiento.

La Seguridad en SQL Server: Identificar Roles de Administrador a Nivel de Servidor

Entendiendo Kerberos en SQL Server: Seguridad y Autenticación

SQL login failed for user ‘NT AUTHORITY \ ANONYMOUS LOGIN’

Cómo Obtener el tamaño de los archivos de Datos en SQL Server

Top de Tablas del Sistema SQL Server más importantes