共用方式為


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

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

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

徵兆

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

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

注意

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

原因

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

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

注意

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

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

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

因應措施

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

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

    DELETE FROM <TableName> WITH (TABLOCK)
    

    注意

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

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

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