當您使用 DELETE 語句從資料表中刪除數據之後,數據表所使用的空間不會完全釋放 SQL Server

本文可協助您解決在使用 DELETE 語句從資料表中刪除所有數據之後,無法釋放數據表使用的問題。

原始產品版本: SQL S
原始 KB 編號: 913399

徵狀

在 Microsoft SQL Server 中使用 DELETE 語句從資料表中刪除資料之後,您可能會注意到數據表所使用的空間並未完全釋放。 當您接著嘗試在資料庫中插入資料時,可能會收到下列錯誤訊息:

無法為資料庫 『DatabaseName』 中的物件 『TableName』 配置空間,因為 『PRIMARY』 檔案群組已滿。

注意事項

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

原因

之所以發生此問題,是因為 SQL Server 在下列條件成立時,只會釋放堆積數據表使用的所有頁面:

  • 此資料表上發生刪除。
  • 正在保留數據表層級鎖定。

注意事項

堆積數據表是未與叢集索引相關聯的任何數據表。

如果頁面未解除分配,資料庫中的其他物件就無法重複使用這些頁面。

不過,當您在 SQL Server 資料庫中啟versioning-based用數據列隔離等級時,即使保留數據表層級鎖定,也無法釋放頁面。 如需數據列versioning-based隔離等級的詳細資訊,請參閱 SQL Server Database Engine 中的隔離等級

因應措施

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

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

    DELETE FROM <TableName> WITH (TABLOCK)
    

    注意事項

    <TableName> 代表數據表的名稱。

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

    TRUNCATE TABLE <TableName>
    
  • 在數據表的數據行上建立叢集索引。 如需如何在數據表上建立叢集索引的詳細資訊,請參閱 建立叢集索引