當您使用 DELETE 子句刪除 SQL Server 資料表中的資料後,資料表所使用的空間並未完全發行

本文可協助您解決當您使用 DELETE 子句刪除資料表中的所有資料後,資料表所使用的問題無法發行。

原始產品版本:   Sqlserver
原始 KB 編號:   913399

徵狀

在 Microsoft SQL Server 中使用 DELETE 子句刪除資料表中的資料之後,您可能會發現該表使用的空間並未完全發行。 當您嘗試在資料庫中插入資料時,可能會收到下列錯誤訊息:

因為 ' PRIMARY ' 的檔組已滿,所以無法為資料庫 'DatabaseName' 中的物件 'TableName' 指派空間。

注意

TableName 代表表格的名稱。 DatabaseName 代表包含資料表的資料庫名稱。

原因

發生此問題的原因是,當下列條件成立時,SQL Server 只會釋放所有的堆表格所使用的頁面:

  • 會發生在此資料表上的刪除。
  • 保留表格層級鎖定。

注意

堆表格是任何未與叢集索引產生關聯的資料表。

如果未解除配置頁面,則資料庫中的其他物件將無法重複使用頁面。

不過,當您啟用 versioning-based SQL Server 2005 資料庫中的資料行隔離層級時,即使已保留資料表層級鎖定,也無法釋放頁面。 如需資料列 versioning-based 隔離層級的詳細資訊,請參閱《 SQL Server 2005 手冊》中的「使用列版本設定的隔離層級」主題。

因應措施

若要解決此問題,請使用下列其中一種方法:

  • 如果未啟用列版本設定的隔離層級,請在 DELETE 子句中包含一個 TABLOCK 提示。 例如,請使用類似下列的語句:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    注意

    <TableName> 代表表格的名稱。

  • 若要刪除資料表中的所有記錄,請使用截斷 TABLE 語句。 例如,請使用類似下列的語句:

    TRUNCATE TABLE <TableName>
    
  • 在資料表的資料行上建立聚簇索引。 如需如何在資料表上建立成簇索引的詳細資訊,請參閱《 SQL Server 線上叢書》中的「建立成簇索引」主題。