當您使用 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>
在數據表的數據行上建立叢集索引。 如需如何在數據表上建立叢集索引的詳細資訊,請參閱 建立叢集索引。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應