After you use a DELETE statement in Microsoft SQL Server to delete data from a table, you may notice that the space that the table uses is not completely released. When you then try to insert data in the database, you may receive the following error message:
Could not allocate space for
object 'TableName' in database
'DatabaseName' because the 'PRIMARY' filegroup is
represents the name
of the table. DatabaseName
name of the database that contains the table.
This problem occurs because SQL Server only releases all the pages that a heap table uses when the following conditions are true:
- A deletion on this table occurs.
- A table-level
lock is being held.
A heap table is any table that is not associated with a clustered index.
If pages are not deallocated, other objects in the database
cannot reuse the pages.
However, when you enable a row versioning-based isolation level in a SQL Server 2005 database, pages cannot be released even if a table-level lock is being held. For more information about row versioning-based isolation levels, see the "Using Row Versioning-based Isolation Levels" topic in SQL Server 2005 Books Online.
To work around this problem, use one of the following methods:
- Include a TABLOCK hint in the DELETE statement if a row
versioning-based isolation level is not enabled. For example, use a statement
that is similar to the following:
Note <TableName> represents the name of the table.
DELETE FROM <TableName> WITH (TABLOCK)
- Use the TRUNCATE TABLE statement if you want to delete all
the records in the table. For example, use a statement that is similar to the
TRUNCATE TABLE <TableName>
- Create a clustered index on a column of the table. For more
information about how to create a clustered index on a table, see the "Creating
a Clustered Index" topic in SQL Server Books Online.
has confirmed that this is a problem in the Microsoft products that are listed
in the "Applies to" section.