徵狀
假設您有一個表格,其中包含 Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014 中的大型物件(LOB)資料行。 當您使用較小的 LOB 資料更新 LOB 欄,並嘗試使用下列方法回收未使用的空間:
-
DBCC SHRINKDATABASE/DBCC SHRINKFILE
-
變更索引重組(LOB_COMPACTION = 開啟)
在這種情況下,無法回收未使用的空間。
解決方案
此問題最初是在 SQL Server 的後續累積更新中修正。
SQL Server 2012 SP2 累積更新2 /en-us/help/2983175
SQL Server 2012 SP1 累積更新11 /en-us/help/2975396
針對 SQL Server 2008 R2 SP2 累積更新13 /en-us/help/2967540
SQL Server 2014 的累積更新2 /en-us/help/2967546
SQL Server 2008 SP3 的累積更新17 /en-us/help/2958696
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 查看 SQL Server 的最新累計更新:
因應措施
若要解決此問題,請使用下列因應措施:
-
將所有資料列匯出至新資料表,然後將列移回。 這會重組 LOB 資料並釋放未使用的空間。
-
使用 DBCC SHRINKFILE 搭配 EMPTYFILE 選項,將所有資料移至新加入的資料檔,然後移除舊的資料檔案。 這會透過釋放未使用的空間來重組 LOB 資料。
其他相關資訊
下列範例顯示在您使用較小的 LOB 資料更新 LOB 欄之前及之後,使用 TSQL 命令 sp_spaceused 「table_name 」所未使用的空間:更新之前:
列名 |
排 |
留給 |
資料 |
index_size |
未使用 |
table_name |
1000 |
261072 KB |
261056 KB |
16 KB |
0 KB |
更新後:
列名 |
排 |
留給 |
資料 |
index_size |
未使用 |
table_name |
1000 |
261072 KB |
199672 KB |
16 KB |
61384 KB |
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。