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 usa una tabla que no se puede liberar después de usar una instrucción DELETE para eliminar todos los datos de la tabla.

Versión original del producto:   SQL Server
Número 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 está completamente liberado. Cuando intente insertar datos en la base de datos, es posible que reciba 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 libera solo todas las páginas que usa una tabla de montón cuando se cumplen las siguientes condiciones:

  • 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 agrupado.

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

Sin embargo, al habilitar un nivel de aislamiento de fila en una base de datos de SQL Server 2005, las páginas no se pueden liberar incluso si se mantiene un bloqueo de nivel versioning-based de tabla. Para obtener más información acerca de los niveles de aislamiento de fila, vea el tema "Uso de niveles de aislamiento basados en versiones de fila" en versioning-based SQL Server 2005 Books Online.

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 el control de 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 agrupado en una columna de la tabla. Para obtener más información acerca de cómo crear un índice agrupado en una tabla, vea el tema "Creación de un índice agrupado" en SQL Server Books Online.