症狀
假設你有一個資料表,包含一個大型物件 (LOB) 欄位,年份Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014。 當你用較小的 LOB 資料來更新 LOB 欄位,並嘗試用以下方法回收未使用的空間時:
- DBCC 縮減資料庫 / DBCC 縮減檔案
- 變更索引重組, (LOB_COMPACTION =)
在這種情況下,未使用的空間無法回收。
解決方式
此問題首次在 SQL Server 的累積更新中得到修正。
2012 SQL Server SP2 累積更新 2 /en-us/help/2983175
2012 SQL Server SP1 累積更新 11 /en-us/help/2975396
2008 SQL Server R2 SP2 的累積更新 13 /en-us/help/2967540
2014 SQL Server 累積更新 2 /en-us/help/2967546
2008 SQL Server SP3 累積更新 17 /en-us/help/2958696
關於 SQL Server 的累積更新
每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 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 資料。
更多資訊
以下範例透過 TSQL 指令 sp_spaceused 'table_name',在更新 LOB 欄位前後顯示未使用的空間,並縮小 LOB 資料:
在你更新之前:
| 名稱 | 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 產品中的問題。