當您使用 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>
在數據表的數據行上建立叢集索引。 如需如何在數據表上建立叢集索引的詳細資訊,請參閱 建立叢集索引。