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


Error #: 219514 (SQL Server 8,0)

Síntomas


Después de usar una instrucción DELETE en Microsoft SQL Server para eliminar datos de una tabla, es posible que observe que el espacio que usa la tabla no se ha soltado por completo. 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' de la base de datos 'DatabaseName' porque el grupo de archivos ' principal ' está lleno.
Nota TableName representa el nombre de la tabla. NombreDeBaseDeDatos 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 montones 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 montones es cualquier tabla que no esté asociada a un índice agrupado. Si las páginas no se desasignan, otros objetos de la base de datos no podrán volver a usarla. Sin embargo, al habilitar un nivel de aislamiento basado en versiones de fila en una base de datos de SQL Server 2005, las páginas no se pueden liberar aunque se mantenga un bloqueo de nivel de tabla. Para obtener más información acerca de los niveles de aislamiento basados en la versión de fila, consulte el tema "uso de niveles de aislamiento basados en versiones de fila" en los libros en línea de SQL Server 2005.

Solución alternativa


Como solución alternativa para este problema, utilice uno de los métodos siguientes:
  • Incluya una sugerencia TABLOCK en la instrucción DELETE si el nivel de aislamiento basado en versiones de fila no está habilitado. 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>
  • Crear 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, consulte el tema "crear un índice agrupado" en los libros en línea de SQL Server.

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".