El espacio que usa una tabla no se libera completamente después de usar una instrucción DELETE para eliminar datos de la tabla en SQL Server

Este artículo le ayuda a solucionar el problema que una tabla usa no se puede publicar después de usar una instrucción DELETE para eliminar todos los datos de la tabla.

Versión del producto original: SQL Server
Número de KB original: 913399

Síntomas

Después de usar una instrucción DELETE en Microsoft SQL Server para eliminar datos de una tabla, puede observar que el espacio que usa la tabla no se ha liberado por completo. Cuando intente insertar datos en la base de datos, puede recibir el siguiente mensaje de error:

No se pudo asignar espacio para el objeto "TableName" en la base de datos "DatabaseName" porque el grupo de archivos "PRIMARY" está lleno.

Nota:

TableName representa el nombre de la tabla. DatabaseName representa el nombre de la base de datos que contiene la tabla.

Causa

Este problema se produce porque SQL Server solo libera todas las páginas que usa una tabla de montón cuando se cumplen las condiciones siguientes:

  • Se produce una eliminación en esta tabla.
  • Se mantiene un bloqueo de nivel de tabla.

Nota:

Una tabla de montón es cualquier tabla que no esté asociada a un índice clúster.

Si las páginas no están desasignadas, otros objetos de la base de datos no pueden reutilizar las páginas.

Sin embargo, al habilitar un nivel de aislamiento de fila versioning-based en una base de datos de SQL Server, las páginas no se pueden liberar incluso si se mantiene un bloqueo de nivel de tabla. Para obtener más información sobre los niveles de aislamiento de filaversioning-based, vea Niveles de aislamiento en el motor de base de datos de SQL Server.

Solución alternativa

Para solucionar este problema, use uno de los métodos siguientes:

  • Incluya una sugerencia TABLOCK en la instrucción DELETE si no está habilitado un nivel de aislamiento basado en versiones de fila. Por ejemplo, use una instrucción similar a la siguiente:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Nota:

    <TableName> representa el nombre de la tabla.

  • Use la instrucción TRUNCATE TABLE si desea eliminar todos los registros de la tabla. Por ejemplo, use una instrucción similar a la siguiente:

    TRUNCATE TABLE <TableName>
    
  • Cree un índice clúster en una columna de la tabla. Para obtener más información sobre cómo crear un índice clúster en una tabla, consulte Creación de índices clúster.