KB2967240 - 修正:無法在包含 LOB 欄位的資料表中使用縮小操作來回收未使用的空間SQL Server

套用到
SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

症狀

假設你有一個資料表,包含一個大型物件 (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 的最新累積更新:

      

因應措施

為了解決這個問題,請使用以下變通方法:

  • 把所有資料匯出到新資料表,然後把資料列往後移。 此舉會重新組織 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 產品中的問題。