DBCC SHRINKDATABASE (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsBase de datos de Azure SQL en Microsoft Fabric

Reduce el tamaño de los archivos de datos y de registro de la base de datos especificada.

No consideres las operaciones de reducción como una operación de mantenimiento normal. Los archivos de datos y de registro que crecen debido a operaciones empresariales periódicas normales no requieren operaciones de reducción.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server:

DBCC SHRINKDATABASE
( database_name | database_id | 0
     [ , target_percent ]
     [ , { NOTRUNCATE | TRUNCATEONLY } ]
)
[ WITH
    {
         [ WAIT_AT_LOW_PRIORITY
            [ (
                  <wait_at_low_priority_option_list>
             ) ]
         ]
         [ , NO_INFOMSGS ]
    }
]

<wait_at_low_priority_option_list> ::=
    <wait_at_low_priority_option>
    | <wait_at_low_priority_option_list>
      , <wait_at_low_priority_option>

<wait_at_low_priority_option> ::=
  ABORT_AFTER_WAIT = { SELF | BLOCKERS }

Sintaxis para Azure Synapse Analytics:

DBCC SHRINKDATABASE
( database_name
     [ , target_percent ]
)
[ WITH NO_INFOMSGS ]

Argumentos

{ database_name | database_id | 0 }

El nombre o ID de la base de datos para reducir. Un valor de 0 especifica la base de datos actual.

porcentaje_objetivo

El porcentaje de espacio libre que se debe dejar en el archivo de la base de datos después de que termine la operación de reducción.

Si especificas target_percent con TRUNCATEONLY, la operación de reducción puede que no libere espacio libre al final del archivo.

NOTRUNCATE

Desplaza las páginas asignadas desde el final del archivo a páginas no asignadas en el principio del archivo. Esta acción compacta los datos dentro del archivo. target_percent es opcional. Azure Synapse Analytics no es compatible con esta opción.

El espacio disponible al final del archivo no se devuelve al sistema operativo, y el tamaño físico del archivo no cambia. Por tanto, parece que la base de datos no se reduce cuando se especifica NOTRUNCATE.

NOTRUNCATE se aplica solo a archivos de datos. NOTRUNCATE no afecta al archivo de registro.

TRUNCATESOLO

Libera todo el espacio libre al final del archivo en el sistema operativo. Dentro del archivo no se mueve ninguna página. El archivo de datos se reduce solo a la última extensión asignada. Azure Synapse Analytics no es compatible con esta opción.

Si especificas target_percent con TRUNCATEONLY, la operación de reducción puede que no libere espacio libre al final del archivo.

CON NO_INFOMSGS

Suprime todos los mensajes informativos con niveles de gravedad entre 0 y 10.

WAIT_AT_LOW_PRIORITY con operaciones de reducción

Aplica a: SQL Server 2022 (16.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, base de datos SQL en Microsoft Fabric

La función de espera a baja prioridad reduce la contención de bloqueo durante la operación de reducción. Para obtener más información, consulte Descripción de los problemas de simultaneidad con DBCC SHRINKDATABASE.

Esta característica es similar a WAIT_AT_LOW_PRIORITY con operaciones de índice en línea, con algunas diferencias.

  • No puedes especificar ABORT_AFTER_WAIT la opción NONE.
  • No puedes configurar la MAX_DURATION opción. El tiempo de espera de bloqueo de baja prioridad para una operación de reducción es siempre de un minuto.

WAIT_AT_LOW_PRIORITY

Cuando se ejecuta un comando de reducción en WAIT_AT_LOW_PRIORITY modo, las consultas que requieren bloqueos de estabilidad de esquema (Sch-S) en las páginas del Mapa de Asignación de Índices (IAM) no se bloquean con la operación de reducción. Sin embargo, la operación de reducción puede ser bloqueada por un Sch-S bloqueo en una página IAM. Shrink sigue ejecutándose solo cuando es capaz de obtener un bloqueo de modificación de esquema (Sch-M) en una página IAM que requiera.

Si una operación de reducción en WAIT_AT_LOW_PRIORITY modo no puede obtener este bloqueo debido a una consulta de larga duración que contiene un Sch-S bloqueo, la operación de reducción expira con el error 49516, por ejemplo: Msg 49516, Level 16, State 1, Line 134 Shrink timeout waiting to acquire schema modify lock in WLP mode to process IAM pageID 1:2865 on database ID 5.

{ ABORT_AFTER_WAIT = [ YO | BLOQUEADORES ] }

  • SELF

    SELF es la opción predeterminada. Sal de la operación de reducción de la base de datos que se está ejecutando sin tomar ninguna acción adicional.

  • BLOCKERS

    Elimina todas las transacciones de usuario que bloquean la operación de reducción de archivo, de forma que dicha operación pueda continuar. La BLOCKERS opción requiere que el inicio de sesión tenga el ALTER ANY CONNECTION permiso de o.KILL DATABASE CONNECTION

Conjunto de resultados

En la tabla siguiente se describen las columnas del conjunto de resultados.

Nombre de la columna Descripción
DbId Número de identificación de la base de datos del archivo que el Motor de base de datos intentó reducir.
FileId Número de identificación del archivo que el Motor de base de datos intentó reducir.
CurrentSize El número de páginas de 8 KB que el archivo ocupa actualmente.
MinimumSize El número de páginas de 8 KB que el archivo podría ocupar, como mínimo. Este valor se corresponde al tamaño mínimo o tamaño de creación original de un archivo.
UsedPages El número de páginas de 8 KB que utiliza actualmente el archivo.
EstimatedPages El número de páginas de 8 KB al que el Motor de base de datos estima que se puede reducir el archivo.

Nota:

El Motor de base de datos no muestra filas de archivos que no están reducidos.

Comentarios

Para reducir todos los archivos de datos y de registro de una base de datos específica, ejecute el comando DBCC SHRINKDATABASE. Para reducir un archivo de datos o de registro de cada vez para una base de datos específica, ejecute el comando DBCC SHRINKFILE.

Para ver la cantidad actual de espacio disponible (sin asignar) en la base de datos, ejecute sp_spaceused.

Las operaciones DBCC SHRINKDATABASE se pueden detener en cualquier momento del proceso y se conserva el trabajo completado hasta ese momento.

El tamaño de la base de datos no puede ser menor que el tamaño mínimo configurado de la base de datos. El tamaño mínimo se especifica cuando se crea originalmente la base de datos. O bien, el tamaño mínimo puede ser el último tamaño establecido de forma explícita mediante un operación de cambio de tamaño de archivo. Las operaciones como DBCC SHRINKFILE o ALTER DATABASE son ejemplos de operaciones de cambio de tamaño de archivo.

Considere que una base de datos se crea originalmente con un tamaño de 10 MB. Después, aumenta a 100 MB. El tamaño mínimo al que se puede reducir la base de datos es de 10 MB, incluso si se han eliminado todos los datos de la base de datos.

Puedes especificar la NOTRUNCATE opción o la TRUNCATEONLY opción cuando ejecutes DBCC SHRINKDATABASE. Si no especificas ninguna de las dos opciones, el resultado es el mismo que si ejecutas una DBCC SHRINKDATABASE operación con NOTRUNCATE seguida de otra DBCC SHRINKDATABASE con TRUNCATEONLY.

No es necesario que la base de datos reducida esté en modo de usuario único. Otros usuarios pueden estar trabajando en la base de datos cuando se reduce, incluidas las bases de datos del sistema.

No se puede reducir una base de datos mientras se está realizando una copia de seguridad de la misma. Por el contrario, no se puede realizar una copia de seguridad de una base de datos mientras se está realizando una operación de reducción en ella.

En los pools SQL de Azure Synapse, evita ejecutar un comando reductor porque es una operación intensiva en E/S que puede desconectar tu pool SQL dedicado (antes SQL DW). Este comando también afecta al coste de las instantáneas de tu almacén de datos.

Problemas conocidos

Aplica a: SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics dedicado SQL pool

  • En SQL Server 2022 (16.x) y versiones anteriores, las páginas utilizadas por los tipos de columna LOB (varbinary(max),varchar(max) y nvarchar(max)) en segmentos comprimidos de columnstore no pueden moverse por DBCC SHRINKDATABASE y DBCC SHRINKFILE. Para obtener más información, consulte Novedades de los índices de almacén de columnas.

Cómo funciona DBCC SHRINKDATABASE

DBCC SHRINKDATABASE reduce los archivos de datos de uno en uno, pero reduce los archivos de registro como si todos estuvieran en una agrupación de registros contiguos. Los archivos se reducen siempre desde el final.

Supongamos que tienes dos archivos de registro y un archivo de datos en una base de datos llamada mydb. Los archivos de datos y de registro tienen 10 MB cada uno, y el archivo de datos contiene 6 MB de datos. El Motor de base de datos calcula un tamaño de destino para cada archivo. Este valor es el tamaño objetivo del archivo tras reducir. Cuando especificas DBCC SHRINKDATABASE con target_percent, el Motor de base de datos calcula el tamaño objetivo como la cantidad target_percent de espacio libre en el archivo tras reducir.

Por ejemplo, si establece el valor de target_percent en 25 para reducir mydb, el Motor de base de datos calcula que el tamaño de destino del archivo de datos será de 8 MB (6 MB de datos más 2 MB de espacio disponible). Por tanto, el Motor de base de datos pasa los datos de los últimos 2 MB del archivo de datos al espacio disponible de los primeros 8 MB del archivo de datos y, después, reduce el archivo.

Suponga que el archivo de datos de mydb contiene 7 MB de datos. Si se especifica un target_percent de 30, este archivo de datos se puede reducir al porcentaje libre de 30. Sin embargo, especificar un target_percent de 40 no reduce el archivo de datos porque no se puede crear suficiente espacio libre en el tamaño total actual del archivo de datos.

O lo que es lo mismo: 40 % de espacio disponible deseado + 70 % de datos en el archivo (7 MB de 10 MB) es mayor que 100 %. Cualquier valor de target_percent mayor que 30 no reducirá el archivo de datos. No se reducirá porque el porcentaje de espacio disponible que quiere y el porcentaje actual que ocupa el archivo de datos es más del 100 %.

En los archivos de registro, el Motor de base de datos usa target_percent para calcular el tamaño de destino completo del registro. Por ese motivo, target_percent es la cantidad de espacio libre en el registro después de la operación de reducción. El tamaño final del registro entero se traduce al tamaño final de cada archivo de registro.

DBCC SHRINKDATABASE intenta reducir cualquier archivo de registro físico a su tamaño final de forma inmediata. Si ninguna parte del registro lógico permanece en los registros virtuales más allá del tamaño objetivo del archivo de registro, DBCC SHRINKDATABASE el archivo se trunca con éxito y termina sin ningún mensaje. Pero si parte del registro lógico permanece en los registros virtuales más allá del tamaño final, el Motor de base de datos libera tanto espacio como sea posible y después emite un mensaje informativo. El mensaje describe las acciones para mover el log lógico fuera de los registros virtuales al final del archivo. Después de ejecutar las acciones, úsalas DBCC SHRINKDATABASE para liberar el espacio restante.

Solo puedes reducir un archivo de registro a un límite virtual de archivo de log. Por eso no es posible reducir un archivo de registro a un tamaño menor que el de un archivo de registro virtual. El Motor de base de datos elige dinámicamente el tamaño del archivo de registro virtual al crear o extender archivos de registro.

Descripción de los problemas de simultaneidad con DBCC SHRINKDATABASE

Los comandos de reducción de bases de datos y reducción de archivos pueden provocar problemas de concurrencia, especialmente con mantenimiento activo como la reconstrucción de índices, o en entornos OLTP muy concurridos.

Por ejemplo, una consulta de usuario puede adquirir un bloqueo de estabilidad de esquema (Sch-S) en una página de Mapa de Asignación de Índice (IAM) y mantenerlo hasta completarse. Al intentar recuperar espacio durante el uso habitual, las operaciones de reducción de base de datos y reducción de archivos requieren un bloqueo de modificación de esquema (Sch-M) al mover o eliminar páginas IAM, bloqueando los Sch-S bloqueos necesarios para las consultas del usuario. Como resultado, las consultas de larga duración pueden bloquear una operación de reducción. Este comportamiento también significa que cualquier nueva consulta que requiera un Sch-S bloqueo en una página IAM puede entrar en cola detrás de la operación de reducción, agravando aún más este problema de concurrencia.

Introducida en SQL Server 2022 (16.x), la función de espera a baja prioridad para operaciones de reducción aborda este problema al tomar el bloqueo de modificación de esquema en las páginas IAM en este WAIT_AT_LOW_PRIORITY modo. Para obtener más información, consulte WAIT_AT_LOW_PRIORITY con operaciones de reducción.

Para más información sobre Sch-S y Sch-M bloqueos, consulte la guía de bloqueo de transacciones y versionado de filas.

Procedimientos recomendados

Tenga en cuenta la siguiente información cuando vaya a reducir una base de datos:

  • Una reducción es más efectiva después de una operación que cree espacio sin usar, como por ejemplo una operación para truncar o eliminar tablas.

  • La mayoría de las bases de datos requieren cierto espacio libre para las operaciones diarias regulares. Si reduces repetidamente un archivo de base de datos y observas que el tamaño de la base de datos vuelve a crecer, este crecimiento indica que las operaciones regulares requieren espacio libre. En estos casos, reducir repetidamente el archivo de la base de datos es contraproducente. El crecimiento de archivos necesario para asignar nuevo espacio tras la reducción puede dificultar el rendimiento.

  • Una operación de reducción no preserva el estado de fragmentación de los índices en la base de datos y puede aumentar la fragmentación del índice, lo que podría reducir el rendimiento de E/S de lectura para consultas que usan escaneos grandes.

  • A menos que tenga un requisito específico, no establezca la AUTO_SHRINK opción de base de datos en ON.

  • Si necesitas reducir los archivos de datos de una base de datos grande, considera usar el script ShrinkDriver PowerShell. El script automatiza y simplifica el proceso de reducción, convirtiéndolo en una única operación observable y reanudábel. El script reduce varios archivos en paralelo, lo intenta de nuevo cuando se interrumpe y genera informes de estado detallados mientras se ejecuta.

Solución de problemas

Una transacción que se ejecuta con un nivel de aislamiento basado en las versiones de fila puede bloquear las operaciones de reducción. Por ejemplo, ejecutas DBCC SHRINKDATABASE mientras está en curso una gran operación de eliminación bajo un nivel de aislamiento basado en versiones de filas. En este caso, la operación de reducción espera a que termine la operación de eliminación antes de reducir los archivos. Cuando la operación de reducción está en espera, las operaciones DBCC SHRINKFILE y DBCC SHRINKDATABASE imprimen un mensaje informativo (5202 para SHRINKDATABASE y 5203 para SHRINKFILE). Este mensaje se imprime en el registro de errores de SQL Server cada cinco minutos en la primera hora y luego cada hora después. Por ejemplo, si el registro de errores contiene el siguiente mensaje de error:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot
transaction with timestamp 15 and other snapshot transactions linked to
timestamp 15 or with timestamps older than 109 to finish.

Este error significa que las transacciones de instantáneas con marcas de tiempo anteriores a 109 bloquean la operación de reducción. Esa transacción es la última que ha completado la operación de reducción. También indica que las transaction_sequence_num columnas o first_snapshot_sequence_num en la vista de gestión dinámica de sys.dm_tran_active_snapshot_database_transactions contienen un valor de 15. Es posible que las columnas transaction_sequence_num o first_snapshot_sequence_num de la vista contengan un número inferior al de la última transacción completada mediante una operación de reducción (109). Si es así, la operación de reducción espera a que finalicen esas transacciones.

Para resolver el problema, puedes hacer una de las siguientes acciones:

  • Finalizar la transacción que bloquea la operación de reducción
  • Finalizar la operación de reducción Se conserva todo el trabajo completado.
  • No hacer nada y permitir que la operación de reducción espere a que finalice la transacción que la está bloqueando.

Permisos

Debe pertenecer al rol fijo de servidor sysadmin o al rol fijo de base de datos db_owner .

Ejemplos

Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.

Un. Reducir una base de datos y especificar un porcentaje de espacio disponible

En el ejemplo siguiente se reduce el tamaño de los archivos de datos y de registro de la base de datos de usuario UserDB para dejar un 10 % de espacio disponible en la base de datos.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B. Truncar una base de datos

En el ejemplo siguiente se reducen los archivos de datos y de registro de la base de datos de ejemplo AdventureWorks2025 al último tamaño asignado.

DBCC SHRINKDATABASE (AdventureWorks2025, TRUNCATEONLY);

C. Reducir una base de datos de Azure Synapse Analytics

DBCC SHRINKDATABASE (database_A);
DBCC SHRINKDATABASE (database_B, 10);

D. Reducir una base de datos con WAIT_AT_LOW_PRIORITY

En el ejemplo siguiente se intenta reducir el tamaño de los archivos de datos y de registro de la base de datos AdventureWorks2025 para dejar un 20 % de espacio disponible en la base de datos. Si no se puede obtener un bloqueo en un minuto, se anula la operación de reducción.

DBCC SHRINKDATABASE ([AdventureWorks2025], 20) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);