Categoría: Monitoreo y mantenimiento SQL

Carta al cielo

Hoy les escribo desde el silencio. Desde este rincón donde el eco de sus risas aún rebota en las paredes de mi memoria. No sé si me escuchan, Pero yo necesito decirlo.

Gracias por haber existido en mi vida. Por los días en que no necesitábamos palabras para entendernos. Por las miradas cómplices, las tonterías compartidas, los abrazos que no pedían permiso.

Pero hoy no escribo para reclamar. Escribo para soltar. Para dejar que el amor que les tuve no se convierta en peso, sino en viento. Para que sus nombres no duelan, sino iluminen…..

Los dejo ir. No porque ya no los quiero, sino porque merezco seguir. Porque mi historia no termina con su ausencia. Porque aún hay caminos que no he recorrido, y quiero hacerlo con el corazón más liviano.

Adiós, amigos. Gracias por ser parte de mi alma.

Cómo mover la base de datos msdb en SQL Server correctamente

Cómo mover la base de datos msdb en SQL Server correctamente

La base de datos msdb es una de las bases del sistema de SQL Server. Aunque no contiene datos de usuario, es fundamental para la automatización y administración de tareas internas: jobs del Agente SQL, historial de backups, alertas, planes de mantenimiento, entre otros.

Mover msdb a otro disco puede mejorar el rendimiento o ayudarte a reorganizar el almacenamiento. Pero cuidado: hacerlo mal puede evitar que el servidor arranque correctamente.

En este artículo, aprenderás cómo mover msdb de forma segura y en el orden correcto, evitando errores comunes.

🧠 ¿Qué es la base msdb?

La base de datos msdb guarda:

  • Todos los jobs del SQL Server Agent
  • Historial de copias de seguridad y restauraciones
  • Configuración de planes de mantenimiento
  • Alertas y operadores del sistema
  • Datos de Database Mail
  • Ejecución y logs de paquetes SSIS (si se usan)

Si se corrompe o no se encuentra al iniciar el servicio, el Agente SQL Server dejará de funcionar correctamente.

🛑 Requisitos antes de mover msdb

Antes de comenzar, asegúrate de lo siguiente:

✔️ Tienes copias de seguridad de msdb (y preferiblemente de todo el sistema)
✔️ Tienes permisos de administrador sobre el servidor
✔️ La carpeta de destino ya existe
✔️ La cuenta de servicio de SQL Server tiene permisos sobre la carpeta nueva
✔️ El SQL Server Agent puede ser detenido temporalmente

🛠️ Pasos para mover msdb correctamente

1. 📍 Verifica la ruta actual de los archivos

Desde SQL Server Management Studio (SSMS), ejecuta:

SELECT name, physical_name 
FROM sys.master_files
WHERE database_id = DB_ID('msdb');

Esto te mostrará las rutas actuales del archivo .mdf (datos) y .ldf (log) de msdb.

2. ✏️ Modifica las rutas con ALTER DATABASE

Antes de mover cualquier archivo, debes indicarle a SQL Server que cambiará de ubicación. Ejecuta:

USE master;
GO

ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\SQLData\SystemDBs\msdbdata.mdf');
GO

ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBLog, FILENAME = 'D:\SQLData\SystemDBs\msdblog.ldf');
GO

🔸 Asegúrate de que la carpeta D:\SQLData\SystemDBs\ exista.

3. 🔁 Detén el servicio de SQL Server

Después de modificar las rutas, SQL Server no moverá los archivos automáticamente. Debes:

  1. Detener el servicio de SQL Server desde SQL Server Configuration Manager o con PowerShell:
powershellCopiarEditarStop-Service -Name 'MSSQLSERVER'

4. 📁 Mueve los archivos físicamente

Con el servicio detenido, ahora sí puedes mover manualmente los archivos:

  • msdbdata.mdf
  • msdblog.ldf

Desde la ruta antigua (por ejemplo):

C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\

Hacia la nueva ruta:

make D:\SQLData\SystemDBs\

5. 🚀 Inicia el servicio de SQL Server

Una vez movidos los archivos, vuelve a iniciar el servicio:

powershell Start-Service -Name 'MSSQLSERVER'

6. ✅ Verifica que la base se cargó desde la nueva ruta

Conéctate a SSMS y ejecuta de nuevo:

SELECT name, physical_name 
FROM sys.master_files
WHERE database_id = DB_ID('msdb');

Confirma que los archivos están en la nueva ubicación D:\SQLData\SystemDBs\.

7. 🧹 Limpieza (opcional)

Si todo funciona correctamente y no hay errores en el log de arranque, puedes eliminar los archivos antiguos de msdb para liberar espacio.

❌ ¿Qué hacer si SQL Server no arranca?

Si SQL Server no inicia después del cambio, revisa:

  • Que hayas movido ambos archivos (.mdf y .ldf)
  • Que no haya errores tipográficos en la ruta especificada en ALTER DATABASE
  • Que la cuenta de servicio tenga permisos sobre la carpeta nueva
  • El archivo de error (ERRORLOG) en la carpeta de logs de SQL Server

Si es necesario, puedes revertir el cambio volviendo a mover los archivos a su ubicación original.

📌 Conclusión

Mover la base de datos msdb puede ayudarte a reorganizar tus archivos del sistema, mejorar el rendimiento y mantener tu instancia más ordenada.
Lo más importante es hacerlo en el orden correcto: primero con ALTER DATABASE, luego mover los archivos con el servicio detenido.

NTLM en SQL Server: Una Guía Completa

dm_exec_requests en SQL Server

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

Qué es un Query Store en SQL Server

Procedimientos Almacenados Temporales en SQL Server

Cómo mover la base de datos master en SQL Server de forma segura

Cómo mover la base de datos master en SQL Server

La base de datos master es uno de los componentes más críticos del motor de SQL Server. Contiene la información básica sobre la instancia: configuraciones del sistema, rutas de bases de datos, inicio de sesión, endpoints, y mucho más.
Por eso, moverla requiere especial cuidado, ya que un error puede hacer que SQL Server no arranque.

En este artículo te mostraré cómo mover master de forma segura, paso a paso, sin poner en riesgo tu servidor.

https://youtu.be/9QmEf8HVzqA

🧩 ¿Qué es la base de datos master?

La base de datos master forma parte de las bases del sistema de SQL Server (junto con msdb, model y tempdb). Su función principal es almacenar la información estructural de la instancia:

  • Nombres y ubicaciones de las demás bases de datos
  • Inicios de sesión y configuraciones de seguridad
  • Configuración de archivos, rutas, endpoints
  • Información sobre configuraciones globales

📌 Si la base master se corrompe o no se encuentra, SQL Server no podrá iniciar.

🛑 Requisitos previos y precauciones

Antes de mover master, asegúrate de cumplir con lo siguiente:

✔️ Tener una copia de seguridad completa del sistema
✔️ Ser administrador del servidor
✔️ Tener acceso al SQL Server Configuration Manager
✔️ La carpeta de destino ya debe existir y tener permisos de lectura/escritura para la cuenta del servicio de SQL Server
✔️ El servidor no debe estar en producción al momento del cambio

⚠️ No intentes mover master desde SQL Server Management Studio (SSMS). Se debe cambiar desde los parámetros de arranque del motor.

🚀 Paso a paso para mover la base de datos master

1. 📍 Verifica la ruta actual

Abre SSMS (SQL Server Management Studio) y ejecuta la siguiente consulta para saber dónde está actualmente la base master:

SELECT name, physical_name 
FROM sys.master_files
WHERE database_id = DB_ID('master');

Guarda las rutas para referencia.

2. ⚙️ Modifica los parámetros de inicio

  1. Abre SQL Server Configuration Manager.
  2. Ve a SQL Server Services → clic derecho sobre tu instancia → Propiedades.
  3. En la pestaña Startup Parameters, ubica los parámetros -d y -l:
    • -d indica la ruta del archivo de datos .mdf
    • -l indica la ruta del archivo de log .ldf
  4. Cámbialos para que apunten a la nueva ubicación:
-dD:\SQLData\SystemDBs\master.mdf  
-lD:\SQLData\SystemDBs\mastlog.ldf

⚠️ No borres otros parámetros como -e (log de errores)

3. 🔁 Deten el servicio de SQL Server

Desde el mismo Configuration Manager, reinicia la instancia.

✅ Si todo está bien, el servicio arrancará normalmente y podrás conectarte con SSMS.

4. 📁 Copia los archivos a la nueva ubicación

Ejemplo:

Copia:
C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf
C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\mastlog.ldf

Destino:
D:\SQLData\SystemDBs\master.mdf
D:\SQLData\SystemDBs\mastlog.ldf

Asegúrate de copiar, no mover aún.

5. 🧪 Verifica que el cambio fue exitoso

Una vez conectado, ejecuta de nuevo:

SELECT name, physical_name 
FROM sys.master_files
WHERE database_id = DB_ID('master');

La ruta debe coincidir con la nueva ubicación que configuraste.

6. 🧹 Elimina los archivos antiguos

Una vez que verifiques que todo funciona correctamente, puedes eliminar los archivos antiguos para liberar espacio.

7. 🧹 Inicia el servicio de SQL Server.

Después de borrar los archivos ya puedes iniciar el servicio nuevamente, Todo esto tienes que avisarlo con tiempo a las áreas correspondientes que hacen uso de la base de datos para que puedan detener aplicaciones, detener tareas en el servidor, etc.

❌ ¿Qué hacer si SQL Server no inicia?

Si el servicio no arranca, puede ser por:

🔸 Rutas mal escritas en los parámetros
🔸 La carpeta de destino no existe
🔸 Falta de permisos para la cuenta del servicio
🔸 Archivos corruptos o bloqueados por antivirus

📌 En ese caso, revisa el archivo de error (sqlservr.log) en la carpeta de logs, vuelve a Configuration Manager, corrige las rutas, y reinicia.

✅ Conclusión

Mover la base de datos master no es algo que se haga todos los días, pero puede ser necesario para:

  • Optimizar el uso del disco
  • Cumplir políticas de almacenamiento empresarial
  • Reorganizar archivos de sistema

Hazlo solo si es necesario y siempre con respaldo. Un error aquí puede dejar tu servidor fuera de línea.

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

Monitorización del Espacio Utilizado en Tablas SQL: Un Script Esencial para DBAs

SQL Server está causando un alto uso de CPU

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

Análisis de una Sentencia de Bloqueo en SQL Server

Como mover la tempdb de sql server

Mover Tempdb de SQL Server de forma segura

Mover tempdb de SQL Server, a otra unidad o carpeta es una práctica recomendada para mejorar el rendimiento o liberar espacio en disco. Sin embargo, hacerlo incorrectamente puede impedir que SQL Server arranque. En esta guía completa te explico cómo hacerlo paso a paso y qué errores evitar.

🔍 ¿Qué es tempdb?

tempdb es una base de datos temporal que usa SQL Server internamente para muchas operaciones. Se recrea automáticamente cada vez que se reinicia el servidor, y su contenido no es persistente.

🧩 ¿Para qué se utiliza?

SQL Server utiliza tempdb para:

  • Consultas que usan ordenamientos, joins o subconsultas complejas.
  • Operaciones de ordenamiento y agrupación (ORDER BY, GROUP BY).
  • Manejo de versiones de filas para transacciones con Snapshot Isolation.
  • Almacenamiento de tablas temporales (#Temp, ##Temp).
  • Indexación temporal y objetos internos.

⚠️ ¿Por qué es importante?

Debido a su uso intensivo, tempdb puede convertirse en un cuello de botella en sistemas con alta carga. Tener tempdb en un disco rápido o separado del sistema ayuda a:

  • Evitar problemas de rendimiento.
  • Reducir la fragmentación de disco.
  • Aislar el impacto de operaciones pesadas.

📌 ¿Por qué mover tempdb?

La base tempdb es temporal, se recrea cada vez que se reinicia el servidor, pero puede crecer rápidamente según las operaciones que se ejecuten en SQL Server. Moverla a un disco más rápido o separado puede:

  • Mejorar el rendimiento de consultas temporales.
  • Prevenir cuellos de botella en el disco del sistema.
  • Facilitar la administración del almacenamiento.

🛠️ Pasos para mover tempdb

1. Verifica los nombres lógicos de los archivos

Antes de hacer cualquier cambio, ejecuta esta consulta para confirmar los nombres lógicos actuales:

SELECT name, physical_name  
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

Normalmente los nombres son tempdev (archivo de datos) y templog (archivo de log).

2. Ejecuta el script para modificar la ubicación

Modifica la ruta según tus necesidades. Por ejemplo:

USE master;
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLDATA\MSSQL\Data\tempdb.mdf');
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'E:\SQLDATA\MSSQL\Data\templog.ldf');
GO

3. Asegura que la carpeta de destino exista

Verifica que E:\SQLDATA\MSSQL\Data\ exista. Si no, créala manualmente antes de reiniciar el servicio.

4. Da permisos a la cuenta de servicio de SQL Server

SQL Server necesita permisos para crear los archivos en la nueva ubicación.

¿Cómo saber qué cuenta de servicio usa SQL Server?

Puedes consultarlo con esta query:

SELECT servicename, service_account  
FROM sys.dm_server_services;

Luego:

  1. Ve a la carpeta de destino (E:\SQLDATA\MSSQL\Data\)
  2. Haz clic derecho → Propiedades → Seguridad.
  3. Agrega la cuenta de servicio (ej. NT Service\MSSQLSERVER)
  4. Otórgale permisos de lectura, escritura y modificación.

5. Reinicia el servicio de SQL Server

Una vez que hayas hecho los cambios, reinicia el servicio para que tempdb se cree en la nueva ubicación.

Puedes hacerlo desde services.msc, SQL Server Configuration Manager o PowerShell:

Restart-Service -Name 'MSSQLSERVER'

⚠️ Error común: “Access is denied” (Error 5123)

Uno de los errores más comunes al reiniciar después de mover tempdb es:

Error 5123: Operating system error 5 (Access is denied)

Este error indica que SQL Server no tiene permisos para acceder o crear los archivos. La solución es:

  • Verificar que la carpeta de destino exista.
  • Dar permisos a la cuenta de servicio de SQL Server (como se explicó arriba).
  • Asegurarte de que el archivo no esté bloqueado por antivirus u otro proceso.

✅ Confirmar que el cambio fue exitoso

Una vez reiniciado el servicio, ejecuta nuevamente:

SELECT name, physical_name  
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

Verifica que la nueva ruta sea la que especificaste.

🧼 Limpieza (opcional)

Si todo funciona correctamente, puedes eliminar los antiguos archivos de tempdb que quedaron en la ubicación anterior (normalmente C:\Program Files\Microsoft SQL Server\...), ya que no se usarán más.

🧠 Conclusión

Mover tempdb es una operación sencilla pero sensible. Asegúrate de:

  • Verificar los nombres lógicos.
  • Crear las carpetas necesarias.
  • Dar los permisos correctos.
  • Reiniciar el servicio con precaución.

Con estos pasos, tendrás una instalación más optimizada y lista para manejar cargas de trabajo temporales de forma eficiente.

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

EXEC sp_change_users_login SQL SERVER

Insertar Varias Filas en SQL Server: Simplifica tu Trabajo

dm_exec_requests en SQL Server

Entendiendo Kerberos en SQL Server: Seguridad y Autenticación

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

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

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