症狀
假設您有一個資料表,其中包含 Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014 中 LOB) 資料行 (大型物件。 當您以較小的 LOB 資料大小更新 LOB 欄,並嘗試使用下列方法回收未使用的空間時:
- DBCC SHRINKDATABASE / DBCC SHRINKFILE
- ALTER INDEX REORGANIZE WITH (LOB_COMPACTION = ON)
在此情況下,無法回收未使用的空間。
解決方式
此問題已先在下列 SQL Server 累積更新中修正。
SQL Server 2012 SP2 的累積更新 2 /zh-tw/help/2983175
SQL Server 2012 SP1 的累積更新 11 /zh-tw/help/2975396
SQL Server 2008 R2 SP2 的累積更新 13 /zh-tw/help/2967540
2014 年 SQL Server 累積更新 2 /zh-tw/help/2967546
適用於 SQL Server 2008 SP3 的累積更新 17 /zh-tw/help/2958696
關於 SQL Server 的累積更新
SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:
- 適用於 SQL Server 2012 SP2 的最新累積更新
- 適用於 SQL Server 2012 SP1 的最新累積更新
- 適用於 SQL Server 2008 R2 SP2 的最新累積更新
- 適用於 SQL Server 2014 的最新累積更新
- SQL Server 2008 SP3 的最新累積更新
因應措施
若要解決此問題,請使用下列因應措施:
- 將所有資料列匯出至新資料表,然後將資料列移回。 這會重新組織 LOB 資料並釋放未使用的空間。
- 使用 DBCC SHRINKFILE 搭配 EMPTYFILE 選項,將所有資料移至新新增的資料檔案,然後移除舊的資料檔案。 這會透過釋放未使用的空間來重新組織 LOB 資料。
更多資訊
下列範例顯示在使用較小的 LOB 資料更新 LOB 欄之前和之後,使用 TSQL 命令sp_spaceused 'table_name' 的未使用空間:
更新之前:
| 名稱 | rows | 保留 | 資料 | index_size | 未使用 |
|---|---|---|---|---|---|
| table_name | 1000 | 261072 KB | 261056 KB | 16 KB | 0 KB |
更新之後:
| 名稱 | rows | 保留 | 資料 | index_size | 未使用 |
|---|---|---|---|---|---|
| table_name | 1000 | 261072 KB | 199672 KB | 16 KB | 61384 KB |
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。