¿Qué es reducir datos?

Cómo Reducir el Tamaño de tu Base de Datos

Valoración: 4.1 (3241 votos)

Con el tiempo, las bases de datos tienden a crecer a medida que se almacena más información y se realizan diversas operaciones. Sin embargo, a veces, tras eliminar grandes volúmenes de datos, truncar tablas o eliminar objetos, queda una cantidad significativa de espacio sin utilizar dentro de los archivos físicos de la base de datos. Este espacio desperdiciado ocupa lugar en disco y puede, en algunos casos, afectar la gestión general del sistema. La operación de reducción del tamaño de una base de datos (conocida como 'shrink') es un proceso diseñado para recuperar este espacio no asignado y devolverlo al sistema operativo.

Este artículo se enfoca en cómo realizar esta tarea en el entorno de SQL Server, incluyendo SQL Server local, Azure SQL Database y Azure SQL Managed Instance, basándonos en la información proporcionada. Explicaremos el mecanismo, los métodos para llevarla a cabo, las consideraciones importantes antes de iniciar el proceso y qué acciones debes tomar después para asegurar el buen rendimiento de tu base de datos.

¿Cómo reducir el tamaño de una base de datos?
Utilice SQL Server Management Studio Expanda Bases de datos y haga clic con el botón derecho en la base de datos que desee reducir. Seleccione Tareas, Reducir y Base de datos. Se muestra el nombre de la base de datos seleccionada. Se muestra el espacio total usado y no usado de la base de datos seleccionada.

Es fundamental entender que la reducción no es una tarea de mantenimiento rutinaria para la mayoría de las bases de datos y debe aplicarse con cautela y conocimiento de sus efectos secundarios.

Índice de Contenido

¿Por Qué y Cómo Funciona la Reducción?

La razón principal para reducir el tamaño de los archivos de una base de datos es liberar espacio en disco que ha quedado libre internamente después de operaciones que eliminan una gran cantidad de datos. Imagina que tienes un archivo de datos de 100 GB, pero tras archivar o eliminar datos antiguos, solo 40 GB están realmente ocupados por datos. Los otros 60 GB son espacio libre dentro de ese archivo.

La operación de reducción trabaja moviendo las páginas de datos que se encuentran hacia el final del archivo a las áreas libres disponibles más cerca del principio del archivo. Una vez que se han consolidado suficientes páginas libres al final, el espacio libre al final del archivo puede ser "recortado" (deallocated) y devuelto al sistema operativo, permitiendo que otros archivos o aplicaciones utilicen ese espacio en disco.

Es importante destacar que la reducción solo afecta al espacio *no utilizado*. No elimina datos válidos de tus tablas.

Limitaciones y Consideraciones Importantes

Antes de decidir reducir el tamaño de tu base de datos, ten en cuenta las siguientes limitaciones y recomendaciones clave:

  • Tamaño Mínimo: Una base de datos no puede reducirse a un tamaño menor que su tamaño mínimo histórico. Este es el tamaño con el que fue creada originalmente o el último tamaño establecido explícitamente mediante una operación de cambio de tamaño de archivo (como `DBCC SHRINKFILE`). Si tu base de datos se creó con 50 MB y creció a 500 GB, aunque elimines todos los datos, el tamaño mínimo al que podrías reducirla es 50 MB.
  • Conflictos con Copias de Seguridad: No puedes reducir una base de datos mientras se está realizando una copia de seguridad, ni puedes realizar una copia de seguridad mientras la base de datos se está reduciendo.
  • Cuándo es Más Efectiva: La operación de reducción es más efectiva después de operaciones que generan una gran cantidad de espacio no utilizado, como sentencias `DELETE` a gran escala, `TRUNCATE TABLE` o `DROP TABLE`.
  • Espacio Libre Necesario: La mayoría de las bases de datos requieren tener una cierta cantidad de espacio libre disponible para sus operaciones diarias normales (inserciones, actualizaciones, crecimiento de índices, etc.).
  • Crecimiento Recurrente: Si reduces una base de datos y notas que su tamaño vuelve a crecer rápidamente, esto indica que el espacio libre que liberas es necesario para las operaciones regulares. En estos casos, reducir la base de datos repetidamente es una operación inútil y perjudicial. Los eventos de autogrow necesarios para que los archivos de la base de datos vuelvan a crecer afectan el rendimiento.
  • Aumento de la Fragmentación: Una operación de reducción no preserva el estado de fragmentación de los índices en la base de datos; de hecho, generalmente aumenta la fragmentación en un grado significativo. Al mover páginas de datos para consolidar espacio, el orden físico de los datos en el disco se desorganiza con respecto al orden lógico de los índices. Esta es otra razón fundamental para no reducir la base de datos de forma recurrente.
  • Opción AUTO_SHRINK: A menos que tengas un requisito específico y muy bien justificado, no configures la opción de base de datos `AUTO_SHRINK` en ON. Esta opción permite que SQL Server reduzca la base de datos automáticamente cuando considere que hay suficiente espacio libre. Sin embargo, su ejecución automática e incontrolada puede llevar a reducciones frecuentes, causando fragmentación constante y degradando el rendimiento general del servidor. Es una práctica recomendada desactivar `AUTO_SHRINK` y gestionar la reducción manualmente solo cuando sea necesario y apropiado.

Permisos Necesarios

Para realizar una operación de reducción, generalmente necesitas ser miembro del rol fijo de servidor `sysadmin` o del rol fijo de base de datos `db_owner`. Asegúrate de tener los permisos adecuados antes de intentar la operación.

Impacto en Operaciones Concurrentes

Las operaciones de reducción en curso pueden bloquear otras consultas en la base de datos y, a su vez, pueden ser bloqueadas por consultas que ya se estén ejecutando. Esto significa que una reducción puede impactar negativamente la disponibilidad y el rendimiento de la base de datos mientras se ejecuta.

¿Cómo bajar información de una base de datos?
PROCEDIMIENTO1En la página Bases de datos , pulse la base de datos para la que desea descargar registros.2En la pestaña Detalles de base de datos, pulse Descargar registros.3En la página Descargar registros , seleccione los archivos de registro que desea descargar. ...4Pulse Descargar registros.

En SQL Server 2022 (16.x) y versiones posteriores, se introdujo la opción `WAIT_AT_LOW_PRIORITY` para los comandos `DBCC SHRINKDATABASE` y `DBCC SHRINKFILE`. Si una operación de reducción configurada con esta opción no puede obtener los bloqueos necesarios debido a una consulta de larga duración ya en progreso, la operación de reducción finalmente expirará después de un minuto y saldrá silenciosamente, evitando bloquear otras consultas. Esto ofrece una forma de minimizar el impacto en la disponibilidad, aunque la operación de reducción podría no completarse si hay bloqueos persistentes.

Métodos para Reducir una Base de Datos

Existen dos formas principales de iniciar una operación de reducción en SQL Server:

1. Usando SQL Server Management Studio (SSMS)

Este método es ideal para realizar la operación de forma manual a través de una interfaz gráfica.

Los pasos son los siguientes:

  1. Conéctate a la instancia del Motor de Base de Datos de SQL Server en el Explorador de Objetos (Object Explorer).
  2. Expande la instancia y luego expande 'Databases'.
  3. Haz clic derecho sobre la base de datos que deseas reducir.
  4. Apoya el cursor sobre 'Tasks' (Tareas), luego sobre 'Shrink' (Reducir), y selecciona 'Database' (Base de Datos).

Se abrirá la ventana de 'Shrink Database', donde verás información como el nombre de la base de datos, el espacio asignado actual (usado y no usado) y el espacio libre disponible total en los archivos de datos y de log.

En esta ventana, tienes opciones para controlar la reducción:

  • Reorganize files before releasing unused space: (Reorganizar archivos antes de liberar espacio no utilizado). Si seleccionas esta opción, la operación moverá páginas de datos para consolidar el espacio libre al final de los archivos antes de liberarlo. Esto es equivalente a ejecutar `DBCC SHRINKDATABASE` especificando un porcentaje objetivo. Al seleccionar esta opción, debes especificar un 'Maximum free space in files after shrinking'.
  • Maximum free space in files after shrinking: Ingresa el porcentaje máximo de espacio libre que deseas dejar en los archivos de la base de datos después de la reducción. Los valores permitidos están entre 0 y 99.
  • Si dejas desmarcada la opción 'Reorganize files...', la operación es equivalente a ejecutar `DBCC SHRINKDATABASE` con la opción `TRUNCATEONLY`. Esto simplemente libera cualquier espacio libre que ya esté contiguo al final de los archivos, sin mover datos internos. Es más rápido pero puede liberar menos espacio si el espacio libre está disperso dentro del archivo.

Una vez que hayas configurado las opciones, haz clic en 'OK' para iniciar el proceso.

2. Usando Transact-SQL (T-SQL)

El uso de comandos T-SQL es útil para automatizar la reducción o para tener un control más preciso sobre la operación.

El comando principal es `DBCC SHRINKDATABASE`. La sintaxis básica para reducir una base de datos y dejar un porcentaje específico de espacio libre es:

DBCC SHRINKDATABASE (nombre_base_de_datos, porcentaje_libre_objetivo); GO

Por ejemplo, para reducir la base de datos llamada `MiBaseDeDatos` y dejar aproximadamente un 15% de espacio libre:

DBCC SHRINKDATABASE (MiBaseDeDatos, 15); GO

Si solo deseas liberar el espacio libre que ya está al final de los archivos (equivalente a la opción TRUNCATEONLY en SSMS), puedes usar:

DBCC SHRINKDATABASE (MiBaseDeDatos, TRUNCATEONLY); GO

Además de `DBCC SHRINKDATABASE`, existe el comando `DBCC SHRINKFILE`, que te permite reducir archivos individuales (de datos o de log) dentro de una base de datos. Esto es útil si solo un archivo específico ha crecido excesivamente.

¿Cómo reducir el tamaño de una base de datos?
Utilice SQL Server Management Studio Expanda Bases de datos y haga clic con el botón derecho en la base de datos que desee reducir. Seleccione Tareas, Reducir y Base de datos. Se muestra el nombre de la base de datos seleccionada. Se muestra el espacio total usado y no usado de la base de datos seleccionada.

Para reducir un archivo de datos específico a un tamaño objetivo en megabytes:

DBCC SHRINKFILE (nombre_logico_del_archivo, tamaño_objetivo_en_MB); GO

Para liberar solo el espacio libre al final de un archivo específico:

DBCC SHRINKFILE (nombre_logico_del_archivo, TRUNCATEONLY); GO

El `nombre_logico_del_archivo` es el nombre interno del archivo dentro de la base de datos, no el nombre del archivo físico en el sistema operativo. Puedes encontrar los nombres lógicos consultando las vistas de catálogo como `sys.database_files`.

Qué Hacer Después de Reducir una Base de Datos

Como mencionamos, una de las consecuencias más significativas de mover páginas de datos durante la reducción es el aumento de la fragmentación de los índices. Esta fragmentación puede degradar considerablemente el rendimiento de las consultas, ya que el motor de base de datos tiene que realizar más operaciones de E/S aleatorias para leer los datos.

Por lo tanto, una acción crítica a realizar *después* de reducir una base de datos (si se movieron datos, es decir, si no usaste la opción `TRUNCATEONLY` o su equivalente) es reconstruir o reorganizar los índices afectados. Reconstruir un índice crea uno nuevo eliminando el antiguo, consolidando los datos en páginas contiguas y eliminando la fragmentación. Reorganizar un índice es una operación menos intensiva que desfragmenta el nivel hoja del índice.

Considera ejecutar tareas de mantenimiento de índices (reconstrucción o reorganización) en las tablas y índices principales de la base de datos después de una operación de reducción para mitigar el impacto negativo en el rendimiento de las consultas.

Tabla Comparativa: Opciones de Reducción

CaracterísticaReorganizar antes de liberar (Target % en SSMS / DBCC SHRINKDATABASE con %)Solo liberar espacio libre al final (TRUNCATEONLY en SSMS/T-SQL)
MecanismoMueve páginas de datos para consolidar espacio libre al inicio, luego libera espacio al final.Solo libera espacio libre que ya está al final del archivo sin mover datos internos.
Tiempo de ejecuciónGeneralmente más largo, especialmente en archivos grandes con mucho espacio libre disperso.Generalmente más rápido, ya que solo ajusta el final del archivo.
Fragmentación de índicesAumenta significativamente la fragmentación.Causa poca o ninguna fragmentación (a menos que el espacio libre al final requiera un ajuste mínimo del archivo).
Cantidad de espacio liberadoPotencialmente libera más espacio si el espacio libre está disperso dentro del archivo.Libera espacio solo si hay espacio libre contiguo al final del archivo.
Impacto en el rendimiento durante la operaciónMayor potencial de bloqueo y consumo de recursos debido al movimiento de datos.Menor impacto, ya que no mueve datos internos.
Uso recomendadoCuando necesitas recuperar una gran cantidad de espacio disperso y estás preparado para lidiar con la fragmentación posterior (reconstruyendo índices).Cuando necesitas liberar espacio rápidamente y sabes que hay espacio libre significativo al final del archivo, o para reducir el archivo de log.

Preguntas Frecuentes (FAQ)

¿La reducción elimina datos de mi base de datos?
No, la operación de reducción (shrink) no elimina datos de tus tablas. Solo recupera el espacio que ha quedado sin usar dentro de los archivos de datos y de log.
¿Cuándo debería reducir mi base de datos?
Deberías considerar reducir tu base de datos solo después de haber eliminado una cantidad muy grande de datos (por ejemplo, archivado de datos antiguos) y si necesitas recuperar urgentemente el espacio en disco ocupado por ese espacio no utilizado. No es una tarea de mantenimiento regular.
¿Qué porcentaje de espacio libre debo dejar al reducir?
El porcentaje óptimo depende de la tasa de crecimiento y la actividad de tu base de datos. Dejar un 0% es raramente una buena idea, ya que cualquier nueva inserción o actualización hará que el archivo necesite espacio inmediatamente. Un porcentaje entre 10% y 20% puede ser razonable para acomodar cierto crecimiento futuro sin necesidad de que el archivo crezca de inmediato. Sin embargo, la mejor estrategia es dimensionar los archivos adecuadamente desde el principio y monitorear su crecimiento.
Mi base de datos vuelve a crecer después de reducirla. ¿Qué hago?
Esto es una señal clara de que la base de datos necesita ese espacio para operar normalmente. Reducirla repetidamente solo causará fragmentación y afectará el rendimiento sin un beneficio a largo plazo. En su lugar, investiga por qué la base de datos está creciendo (ej. crecimiento de datos, archivos de log grandes) y considera aumentar el tamaño inicial de los archivos o implementar estrategias de archivado de datos.
¿Es lo mismo 'reducir una base de datos' que 'reducir datos'?
No exactamente. 'Reducir una base de datos' (shrink) se refiere a disminuir el tamaño físico de los archivos en disco al recuperar espacio no utilizado. 'Reducir datos' (data reduction) es un término más amplio que puede incluir técnicas como compresión de datos, deduplicación o archivado para disminuir la cantidad total de datos almacenados o su redundancia lógica, lo cual puede o no resultar en una reducción del tamaño físico de los archivos dependiendo de la técnica.
¿Debo reducir el archivo de log de transacciones?
Sí, a menudo es necesario reducir el archivo de log de transacciones (`.ldf`), especialmente si ha crecido mucho debido a transacciones largas o falta de copias de seguridad del log (en modelos de recuperación Full o Bulk-Logged). La reducción del log también recupera espacio no utilizado, pero las consideraciones son ligeramente diferentes a las de los archivos de datos. Generalmente, se usa `DBCC SHRINKFILE` con la opción `TRUNCATEONLY` o especificando un tamaño objetivo.

Conclusión

La operación de reducción de una base de datos en SQL Server es una herramienta poderosa para recuperar espacio en disco que ha quedado sin utilizar. Es más efectiva después de grandes eliminaciones de datos y no debe considerarse una tarea de mantenimiento regular. Comprender sus efectos secundarios, especialmente el aumento de la fragmentación de los índices, es crucial.

Siempre planifica cuidadosamente cuándo y cómo realizar una reducción, utiliza los métodos de SSMS o T-SQL según tu necesidad, y recuerda que, en la mayoría de los casos, deberás reconstruir los índices después de la operación para restaurar el rendimiento óptimo de tus consultas. Evita la opción `AUTO_SHRINK` y enfócate en una gestión proactiva del crecimiento de tus archivos de base de datos.

Si quieres conocer otros artículos parecidos a Cómo Reducir el Tamaño de tu Base de Datos puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir